[Paghubad] Envoy threading model

Paghubad sa artikulo: Envoy threading model - https://blog.envoyproxy.io/envoy-threading-model-a8d44b922310

Nakit-an nako nga kini nga artikulo medyo makapaikag, ug tungod kay ang Envoy kanunay nga gigamit ingon bahin sa "istio" o yano nga "ingress controller" sa mga kubernetes, kadaghanan sa mga tawo wala’y parehas nga direktang interaksyon niini sama sa, pananglitan, sa kasagaran Pag-install sa Nginx o Haproxy. Bisan pa, kung adunay maguba, maayo nga masabtan kung giunsa kini molihok gikan sa sulod. Gisulayan nako nga hubaron ang kadaghanan sa teksto sa Russian kutob sa mahimo, lakip ang espesyal nga mga pulong; alang niadtong nasakitan sa pagtan-aw niini, gibilin nako ang mga orihinal sa parentesis. Welcome sa iring.

Ang ubos nga lebel nga teknikal nga dokumentasyon alang sa Envoy codebase sa pagkakaron gamay ra. Aron masulbad kini, nagplano ako nga maghimo usa ka serye sa mga post sa blog bahin sa lainlaing mga subsystem sa Envoy. Tungod kay kini ang unang artikulo, palihog pahibaloa ako kon unsay imong hunahuna ug kon unsay imong mahimo nga interesado sa umaabot nga mga artikulo.

Usa sa labing komon nga teknikal nga mga pangutana nga akong nadawat bahin sa Envoy mao ang pagpangayo og ubos nga lebel nga paghulagway sa threading model nga gigamit niini. Sa kini nga post, akong ihulagway kung giunsa pag-mapa sa Envoy ang mga koneksyon sa mga hilo, ingon man ang sistema sa Thread Local Storage nga gigamit niini sa sulod aron mahimo ang code nga mas parallel ug high-performance.

Overview sa thread

[Paghubad] Envoy threading model

Gigamit ni Envoy ang tulo ka lainlaing klase sa sapa:

  • Panguna: Kini nga thread nagkontrol sa proseso sa pagsugod ug pagtapos, tanan nga pagproseso sa XDS (xDiscovery Service) API, lakip na ang DNS, health checking, general cluster ug runtime management, statistics reset, administration ug general process management - Linux signals. hot restart, etc. Ang mahitabo sa kini nga thread kay asynchronous ug "non-blocking". Sa kinatibuk-an, ang nag-unang hilo nag-coordinate sa tanan nga kritikal nga mga proseso sa pagpaandar nga wala magkinahanglan usa ka dako nga kantidad sa CPU nga modagan. Gitugotan niini ang kadaghanan sa control code nga isulat ingon nga kini usa ka sinulid.
  • Trabaho: Sa kasagaran, ang Envoy nagmugna og worker thread alang sa matag hardware thread sa sistema, kini mahimong kontrolado gamit ang opsyon --concurrency. Ang matag thread sa trabahante nagpadagan sa usa ka "non-blocking" event loop, nga responsable sa pagpaminaw sa matag tigpaminaw; sa panahon sa pagsulat (Hulyo 29, 2017) walay sharding sa tigpaminaw, pagdawat sa bag-ong mga koneksyon, pag-instantiate sa filter stack alang sa ang koneksyon, ug pagproseso sa tanang input/output (IO) nga mga operasyon sa tibuok kinabuhi sa koneksyon. Pag-usab, kini nagtugot sa kadaghanan sa mga koneksyon sa pagdumala sa code nga isulat ingon nga kini usa ka sinulid.
  • File flusher: Ang matag file nga gisulat ni Envoy, nag-una sa pag-access sa mga log, sa pagkakaron adunay usa ka independente nga blocking thread. Kini tungod sa kamatuoran nga ang pagsulat sa mga file nga gi-cache sa file system bisan kung gigamit O_NONBLOCK mabara usahay (panghupaw). Kung ang mga thread sa trabahador kinahanglan nga magsulat sa usa ka file, ang datos sa tinuud gibalhin sa usa ka buffer sa memorya diin kini sa katapusan ma-flush pinaagi sa thread pag-flush sa file. Kini usa ka lugar sa code diin sa teknikal ang tanan nga mga thread sa trabahador maka-block sa parehas nga kandado samtang naningkamot nga pun-on ang usa ka memory buffer.

Pagdumala sa koneksyon

Sama sa gihisgutan sa makadiyot sa ibabaw, ang tanan nga mga thread sa trabahador maminaw sa tanang tigpaminaw nga walay bisan unsang sharding. Sa ingon, ang kernel gigamit sa maayong pagpadala sa gidawat nga mga socket sa mga thread sa trabahante. Ang mga modernong kernel sa kasagaran maayo kaayo niini, naggamit sila og mga feature sama sa input/output (IO) priority boosting aron sulayan nga pun-on ang usa ka thread sa trabaho sa dili pa sila magsugod sa paggamit sa ubang mga thread nga naminaw usab sa samang socket, ug dili usab mogamit og round robin. pag-lock (Spinlock) aron maproseso ang matag hangyo.
Sa higayon nga ang usa ka koneksyon madawat sa usa ka trabahador nga hilo, kini dili gayud mobiya niana nga hilo. Ang tanan nga dugang nga pagproseso sa koneksyon gidumala sa tibuuk nga thread sa trabahante, lakip ang bisan unsang pamatasan sa pagpasa.

Kini adunay daghang hinungdanon nga mga sangputanan:

  • Ang tanan nga koneksyon pool sa Envoy gi-assign sa usa ka worker thread. Busa, bisan tuod ang HTTP/2 connection pool naghimo lang ug usa ka koneksyon sa matag upstream host sa usa ka higayon, kon adunay upat ka worker threads, adunay upat ka HTTP/2 connections kada upstream host sa usa ka makanunayong kahimtang.
  • Ang rason nga si Envoy nagtrabaho niini nga paagi mao nga pinaagi sa pagtipig sa tanan sa usa ka thread sa trabahante, halos tanan nga code mahimong isulat nga walay pagbabag ug ingon nga kini usa ka thread. Kini nga disenyo nagpasayon ​​sa pagsulat og daghang code ug mga timbangan nga maayo kaayo sa halos walay kinutuban nga gidaghanon sa mga thread sa trabahante.
  • Bisan pa, ang usa sa mga nag-unang takeaways mao nga gikan sa usa ka memory pool ug baroganan sa kahusayan sa koneksyon, sa tinuud hinungdanon kaayo nga i-configure ang --concurrency. Ang pagbaton ug daghang mga thread sa trabahador kay sa gikinahanglan mag-usik sa panumduman, makamugna og daghang walay pulos nga mga koneksyon, ug makunhuran ang gikusgon sa paghugpong sa koneksyon. Sa Lyft, ang among envoy sidecar nga mga sudlanan nagdagan nga ubos kaayo ang concurrency aron ang pasundayag halos motakdo sa mga serbisyo nga ilang gilingkoran. Gipadagan namo ang Envoy isip edge proxy lamang sa maximum concurrency.

Unsay buot ipasabot sa non-blocking?

Ang termino nga "dili pag-block" gigamit sa daghang mga higayon hangtod karon kung hisgutan kung giunsa ang mga panguna ug trabahador nga mga hilo nagtrabaho. Ang tanan nga kodigo gisulat sa pangagpas nga walay bisan unsa nga gibabagan. Bisan pa, kini dili hingpit nga tinuod (unsa ang dili hingpit nga tinuod?).

Gigamit ni Envoy ang daghang taas nga proseso nga mga kandado:

  • Sama sa gihisgutan, sa pagsulat sa mga log sa pag-access, ang tanan nga mga thread sa trabahador makakuha sa parehas nga kandado sa dili pa mapuno ang in-memory log buffer. Ang oras sa pagkupot sa kandado kinahanglan nga ubos kaayo, apan posible nga ang kandado makontra sa taas nga concurrency ug taas nga throughput.
  • Gigamit ni Envoy ang usa ka komplikado kaayo nga sistema sa pagdumala sa mga istatistika nga lokal sa thread. Kini ang mahimong hilisgutan sa usa ka lahi nga post. Bisan pa, akong hisgutan sa makadiyot nga isip bahin sa pagproseso sa mga istatistika sa thread sa lokal, usahay gikinahanglan nga makakuha og kandado sa usa ka sentro nga "stats store". Kini nga pag-lock kinahanglan dili kinahanglan.
  • Ang panguna nga hilo matag karon ug unya kinahanglan nga makig-coordinate sa tanan nga mga hilo sa trabahante. Gihimo kini pinaagi sa "pagmantala" gikan sa main thread ngadto sa worker thread, ug usahay gikan sa worker thread balik sa main thread. Ang pagpadala nanginahanglan usa ka kandado aron ang gipatik nga mensahe mahimong mapila alang sa ulahi nga paghatud. Kini nga mga kandado dili kinahanglan nga seryoso nga awayon, apan mahimo gihapon kini nga ma-block sa teknikal.
  • Sa diha nga ang Envoy nagsulat sa usa ka log sa sistema sa sayup nga sapa (standard error), kini nakakuha og kandado sa tibuok proseso. Sa kinatibuk-an, ang lokal nga pag-log sa Envoy giisip nga makalilisang gikan sa usa ka punto sa pasundayag, mao nga wala’y daghang pagtagad nga gihatag sa pagpauswag niini.
  • Adunay pipila ka uban pang mga random nga kandado, apan walay usa niini ang kritikal sa pasundayag ug dili gayud angay hagiton.

Thread lokal nga pagtipig

Tungod sa paagi nga gilain ni Envoy ang mga responsibilidad sa panguna nga hilo gikan sa mga responsibilidad sa hilo sa trabahador, adunay kinahanglanon nga ang komplikado nga pagproseso mahimo sa panguna nga hilo ug dayon gihatag sa matag hilo sa trabahador sa usa ka dungan nga paagi. Kini nga seksyon naghulagway sa Envoy Thread Local Storage (TLS) sa taas nga lebel. Sa sunod nga seksyon akong ihulagway kung giunsa kini gigamit sa pagdumala sa usa ka cluster.
[Paghubad] Envoy threading model

Sama sa gihulagway na, ang panguna nga hilo nagdumala sa halos tanan nga pagdumala ug pagkontrol sa pagpaandar sa eroplano sa proseso sa Envoy. Ang kontrol nga eroplano medyo overloaded dinhi, apan kung imong tan-awon kini sa sulod sa proseso sa Envoy mismo ug itandi kini sa pagpasa nga gibuhat sa mga thread sa trabahante, makatarunganon. Ang kinatibuk-ang lagda mao nga ang nag-unang proseso sa thread naghimo sa pipila ka trabaho, ug unya kinahanglan nga i-update ang matag worker thread sumala sa resulta sa maong trabaho. sa kini nga kaso, ang trabahador nga hilo dili kinahanglan nga makakuha og lock sa matag access.

Ang TLS (Thread local storage) nga sistema sa Envoy naglihok sama sa mosunod:

  • Ang code nga nagdagan sa main thread mahimong maggahin ug TLS slot para sa tibuok proseso. Bisan tuod kini gikuha, sa praktis kini usa ka index ngadto sa usa ka vector, nga naghatag og O(1) access.
  • Ang nag-unang hilo mahimong mag-install sa arbitraryong datos sa slot niini. Kung nahuman na kini, ang datos gipatik sa matag thread sa trabahante isip usa ka normal nga panghitabo sa loop nga panghitabo.
  • Ang mga thread sa trabahador makabasa gikan sa ilang TLS slot ug makuha ang bisan unsang thread-local data nga anaa didto.

Bisan kung kini usa ka yano kaayo ug dili katuohan nga kusog nga paradigm, parehas kini sa konsepto sa pag-block sa RCU (Read-Copy-Update). Sa tinuud, ang mga thread sa trabahador wala gyud makakita sa bisan unsang pagbag-o sa datos sa mga slot sa TLS samtang nagdagan ang trabaho. Ang pagbag-o mahitabo lamang sa panahon sa pagpahulay tali sa mga panghitabo sa trabaho.

Gigamit kini sa Envoy sa duha ka lainlaing paagi:

  • Pinaagi sa pagtipig sa lainlaing mga datos sa matag thread sa trabahante, ang datos mahimong ma-access nga wala’y bisan unsang pagbabag.
  • Pinaagi sa pagpadayon sa usa ka gipaambit nga pointer sa global nga datos sa read-only mode sa matag worker thread. Sa ingon, ang matag thread sa trabahante adunay usa ka ihap sa pakisayran sa datos nga dili maminusan samtang nagdagan ang trabaho. Kung ang tanan nga mga trabahante mokalma ug mag-upload sa bag-ong gipaambit nga datos nga ang daan nga datos maguba. Parehas kini sa RCU.

Cluster update threading

Niini nga seksyon, akong ihulagway kung giunsa ang TLS (Thread local storage) gigamit sa pagdumala sa usa ka cluster. Ang pagdumala sa kumpol naglakip sa xDS API ug/o pagproseso sa DNS, ingon man ang pagsusi sa kahimsog.
[Paghubad] Envoy threading model

Ang pagdumala sa dagan sa cluster naglakip sa mosunod nga mga sangkap ug mga lakang:

  1. Ang Cluster Manager usa ka component sulod sa Envoy nga nagdumala sa tanang nailhan nga cluster upstreams, ang Cluster Discovery Service (CDS) API, ang Secret Discovery Service (SDS) ug Endpoint Discovery Service (EDS) APIs, DNS, ug aktibong external checking. health checking. Responsable kini sa paghimo og "sa katapusan makanunayon" nga panglantaw sa matag upstream cluster, nga naglakip sa nadiskobrehan nga mga host ingon man sa kahimtang sa panglawas.
  2. Ang health checker mohimo ug aktibong health check ug magreport sa mga kausaban sa status sa panglawas ngadto sa cluster manager.
  3. Ang CDS (Cluster Discovery Service) / SDS (Secret Discovery Service) / EDS (Endpoint Discovery Service) / DNS gihimo aron matino ang cluster membership. Ang pagbag-o sa estado ibalik sa tagdumala sa cluster.
  4. Ang matag thread sa trabahante padayon nga nagpatuman sa usa ka loop sa panghitabo.
  5. Sa diha nga ang cluster manager nagtino nga ang estado alang sa usa ka cluster nausab, kini nagmugna og usa ka bag-o nga read-only snapshot sa cluster sa estado ug ipadala kini ngadto sa matag worker thread.
  6. Atol sa sunod nga hilum nga panahon, ang thread sa trabahador mag-update sa snapshot sa gigahin nga TLS slot.
  7. Atol sa usa ka panghitabo sa I/O nga mao untay magdeterminar sa host sa pag-load sa balanse, ang load balancer mohangyo og TLS (Thread local storage) slot aron makakuha og impormasyon mahitungod sa host. Wala kini magkinahanglan og mga kandado. Timan-i usab nga ang TLS mahimo usab nga mag-trigger sa mga panghitabo sa pag-update aron ang mga balanse sa pagkarga ug uban pang mga sangkap mahimo’g makalkula pag-usab ang mga cache, istruktura sa datos, ug uban pa. Labaw pa kini sa kasangkaran sa kini nga post, apan gigamit sa lainlaing mga lugar sa code.

Gamit ang pamaagi sa ibabaw, mahimo iproseso sa Envoy ang matag hangyo nga wala’y bisan unsang pagbabag (gawas sa gihulagway kaniadto). Gawas sa pagkakomplikado sa TLS code mismo, kadaghanan sa code dili kinahanglan nga masabtan kung giunsa ang multithreading molihok ug mahimong isulat nga single-threaded. Kini naghimo sa kadaghanan sa code nga mas sayon ​​sa pagsulat dugang pa sa labaw nga performance.

Ang ubang mga subsystem nga naggamit sa TLS

Ang TLS (Thread local storage) ug RCU (Read Copy Update) kaylap nga gigamit sa Envoy.

Mga pananglitan sa paggamit:

  • Mekanismo sa pagbag-o sa pagpaandar sa panahon sa pagpatuman: Ang karon nga lista sa gipaandar nga pagpaandar gikalkulo sa panguna nga hilo. Ang matag thread sa trabahador dayon gihatagan og read-only snapshot gamit ang RCU semantics.
  • Pag-ilis sa mga lamesa sa ruta: Alang sa mga lamesa sa ruta nga gihatag sa RDS (Route Discovery Service), ang mga lamesa sa ruta gihimo sa panguna nga hilo. Ang read-only snapshot igahatag dayon sa matag worker thread gamit ang RCU (Read Copy Update) semantics. Kini naghimo sa pagbag-o sa mga lamesa sa ruta nga atomically episyente.
  • HTTP header caching: Ingon nga kini nahimo, ang pagkalkula sa HTTP header alang sa matag hangyo (samtang nagdagan ~ 25K + RPS matag core) medyo mahal. Ang Envoy sa sentro nagkuwenta sa header halos matag tunga sa segundo ug gihatag kini sa matag trabahante pinaagi sa TLS ug RCU.

Adunay uban nga mga kaso, apan ang mga nangaging mga pananglitan kinahanglan maghatag usa ka maayong pagsabut kung unsa ang gigamit sa TLS.

Nailhan nga performance pitfalls

Samtang ang Envoy maayo kaayo sa kinatibuk-an, adunay pipila ka mga bantog nga mga lugar nga nanginahanglan atensyon kung kini gigamit nga adunay taas kaayo nga panagsama ug throughput:

  • Sama sa gihulagway sa kini nga artikulo, sa pagkakaron ang tanan nga mga thread sa trabahador nakakuha og kandado sa pagsulat sa access log memory buffer. Sa taas nga concurrency ug taas nga throughput, kinahanglan nimo nga i-batch ang mga log sa pag-access alang sa matag thread sa trabahador sa gasto sa out-of-order nga paghatud sa pagsulat sa katapusan nga file. Sa laing paagi, makahimo ka og bulag nga access log alang sa matag worker thread.
  • Bisan kung ang mga estadistika labi nga na-optimize, sa labi ka taas nga panagsama ug pag-abut mahimo’g adunay atomic nga panagbingkil sa mga indibidwal nga estadistika. Ang solusyon niini nga problema mao ang mga counter kada worker thread nga adunay periodic reset sa central counters. Kini hisgotan sa sunod nga post.
  • Ang karon nga arkitektura dili molihok nga maayo kung ang Envoy i-deploy sa usa ka senaryo diin adunay gamay ra nga mga koneksyon nga nanginahanglan hinungdanon nga mga kapanguhaan sa pagproseso. Wala’y garantiya nga ang mga koneksyon parehas nga maapod-apod sa mga thread sa mamumuo. Masulbad kini pinaagi sa pagpatuman sa pagbalanse sa koneksyon sa trabahante, nga magtugot sa pagbayloay sa mga koneksyon tali sa mga thread sa trabahante.

Konklusyon

Ang modelo sa threading sa Envoy gidesinyo aron mahatagan og kasayon ​​ang pagprograma ug kaylap nga paralelismo sa gasto sa posibleng mausik nga panumduman ug mga koneksyon kung dili ma-configure sa husto. Gitugotan niini nga modelo nga kini molihok nga maayo sa taas kaayo nga ihap sa thread ug throughput.
Sama sa akong mubo nga gihisgutan sa Twitter, ang disenyo mahimo usab nga modagan sa ibabaw sa usa ka bug-os nga user-mode networking stack sama sa DPDK (Data Plane Development Kit), nga mahimong moresulta sa mga conventional server nga nagdumala sa minilyon nga mga hangyo kada segundo nga adunay bug-os nga pagproseso sa L7. Makapaikag kaayo nga makita kung unsa ang matukod sa sunod nga mga tuig.
Usa ka katapusang dali nga komento: Gipangutana ako sa daghang mga higayon kung nganong gipili namon ang C ++ alang sa Envoy. Ang rason nagpabilin nga kini mao ra gihapon ang kaylap nga gigamit nga industriyal nga grado nga pinulongan diin ang arkitektura nga gihulagway niini nga post mahimong matukod. Ang C ++ siguradong dili angay alang sa tanan o bisan sa daghang mga proyekto, apan alang sa pipila nga mga kaso sa paggamit kini ra gihapon ang himan aron mahuman ang trabaho.

Mga link sa code

Mga link sa mga file nga adunay mga interface ug mga pagpatuman sa header nga gihisgutan sa kini nga post:

Source: www.habr.com

Idugang sa usa ka comment