[Traduzzjoni] Mudell tal-kamini tal-Mibgħut

Traduzzjoni tal-artiklu: Mudell tal-kamini tal-Envoy - https://blog.envoyproxy.io/envoy-threading-model-a8d44b922310

Sibt dan l-artikolu pjuttost interessanti, u peress li l-Envoy huwa l-aktar spiss użat bħala parti mill-"istio" jew sempliċement bħala l-"kontrollur tad-dħul" ta 'kubernetes, ħafna nies m'għandhomx l-istess interazzjoni diretta miegħu bħal, pereżempju, ma' tipiċi Installazzjonijiet Nginx jew Haproxy. Madankollu, jekk tinkiser xi ħaġa, ikun tajjeb li tifhem kif taħdem minn ġewwa. Ippruvajt nittraduċi kemm jista’ jkun mit-test għar-Russu, inkluż kliem speċjali għal dawk li jsibuha ta’ wġigħ li tħares lejn dan, ħallejt l-oriġinali fil-parentesi; Merħba għall-qattus.

Dokumentazzjoni teknika ta 'livell baxx għall-kodiċi Envoy bħalissa hija pjuttost skarsa. Biex nirrimedja dan, qed nippjana li nagħmel sensiela ta’ blogs dwar is-sottosistemi varji ta’ Envoy. Peress li dan huwa l-ewwel artiklu, jekk jogħġbok għarrafni x'taħseb u dak li jista 'jkun interessat fih f'artikli futuri.

Waħda mill-aktar mistoqsijiet tekniċi komuni li nirċievi dwar Envoy hija li titlob deskrizzjoni ta' livell baxx tal-mudell tal-kamin li juża. F'din il-kariga, ser niddeskrivi kif Envoy jimmappa l-konnessjonijiet mal-ħjut, kif ukoll is-sistema Thread Local Storage li tuża internament biex tagħmel il-kodiċi aktar parallel u ta 'prestazzjoni għolja.

Ħarsa ġenerali tal-kamini

[Traduzzjoni] Mudell tal-kamini tal-Mibgħut

Envoy juża tliet tipi differenti ta 'flussi:

  • Prinċipali: Dan il-ħajt jikkontrolla l-istartjar u t-terminazzjoni tal-proċess, l-ipproċessar kollu tal-API XDS (xDiscovery Service), inkluż DNS, verifika tas-saħħa, ġestjoni ġenerali tal-cluster u runtime, reset tal-istatistika, amministrazzjoni u ġestjoni ġenerali tal-proċess - sinjali tal-Linux hot restart, eċċ jiġri f'dan il-ħajt huwa asinkroniku u "mhux imblukkar". B'mod ġenerali, il-ħajt prinċipali jikkoordina l-proċessi kollha ta 'funzjonalità kritiċi li ma jeħtiġux ammont kbir ta' CPU biex jaħdmu. Dan jippermetti li l-biċċa l-kbira tal-kodiċi ta 'kontroll jinkiteb bħallikieku kien b'kamin wieħed.
  • Ħaddiem: B'mod awtomatiku, Envoy joħloq ħajt tal-ħaddiem għal kull ħajt tal-ħardwer fis-sistema, dan jista 'jiġi kkontrollat ​​bl-użu tal-għażla --concurrency. Kull ħajta tal-ħaddiem imexxi ċirku ta 'avveniment "li ma jimblokkax", li huwa responsabbli biex jisma' lil kull semmiegħa fil-ħin tal-kitba (29 ta 'Lulju, 2017) m'hemm l-ebda sharding tas-semmiegħ, jaċċetta konnessjonijiet ġodda, tistanja stack ta' filtri għal; il-konnessjoni, u l-ipproċessar tal-operazzjonijiet kollha ta 'input/output (IO) matul il-ħajja tal-konnessjoni. Għal darb'oħra, dan jippermetti li l-biċċa l-kbira tal-kodiċi tal-immaniġġjar tal-konnessjoni jinkiteb bħallikieku kien b'kamin wieħed.
  • Flusher tal-fajl: Kull fajl li jikteb Envoy, prinċipalment zkuk ta 'aċċess, bħalissa għandu ħajt ta' imblukkar indipendenti. Dan huwa dovut għall-fatt li l-kitba għal fajls cache mis-sistema tal-fajls anke meta tuża O_NONBLOCK kultant jista' jiġi mblukkat (sigh). Meta l-ħjut tal-ħaddiem iridu jiktbu f'fajl, id-dejta fil-fatt titmexxa għal buffer fil-memorja fejn eventwalment titlaħlaħ mill-ħajt. fajl flush. Din hija żona waħda tal-kodiċi fejn teknikament il-ħjut tal-ħaddiema kollha jistgħu jimblokkaw l-istess serratura waqt li jippruvaw jimlew buffer tal-memorja.

Immaniġġjar tal-konnessjoni

Kif diskuss fil-qosor hawn fuq, il-ħjut kollha tal-ħaddiema jisimgħu lis-semmiegħa kollha mingħajr ebda sharding. Għalhekk, il-qalba tintuża biex tibgħat b'mod grazzjuż sockets aċċettati lill-ħjut tal-ħaddiema. Il-qlub moderni huma ġeneralment tajbin ħafna f'dan, jużaw karatteristiċi bħall-input/output (IO) boosting ta' prijorità biex jippruvaw jimlew ħajta b'xogħol qabel ma jibdew jużaw ħjut oħra li qed jisimgħu wkoll fuq l-istess socket, u wkoll ma jużawx round robin qfil (Spinlock) biex tipproċessa kull talba.
Ladarba konnessjoni tiġi aċċettata fuq ħajt tal-ħaddiem, qatt ma tħalli dak il-ħajt. L-ipproċessar ulterjuri tal-konnessjoni jiġi mmaniġġjat kollu kemm hu fil-ħajt tal-ħaddiem, inkluż kwalunkwe imġieba ta 'trażmissjoni.

Dan għandu diversi konsegwenzi importanti:

  • Il-pools ta' konnessjoni kollha f'Envoy huma assenjati għal ħajt tal-ħaddiem. Għalhekk, għalkemm il-pools ta 'konnessjoni HTTP/2 jagħmlu konnessjoni waħda biss għal kull host upstream kull darba, jekk ikun hemm erba' ħjut tal-ħaddiema, se jkun hemm erba' konnessjonijiet HTTP/2 għal kull host upstream fi stat stabbli.
  • Ir-raġuni li l-Envoy jaħdem b'dan il-mod hija li billi żżomm kollox fuq ħajt wieħed ta 'ħaddiem, kważi l-kodiċi kollu jista' jinkiteb mingħajr imblukkar u bħallikieku kien ħajt wieħed. Dan id-disinn jagħmilha faċli biex tikteb ħafna kodiċi u skali oerhört tajjeb għal numru kważi illimitat ta 'ħjut tal-ħaddiema.
  • Madankollu, wieħed mill-punti ewlenin huwa li mil-lat tal-ġabra tal-memorja u tal-effiċjenza tal-konnessjoni, fil-fatt huwa importanti ħafna li jiġi kkonfigurat il- --concurrency. Li jkollok aktar ħjut tal-ħaddiema milli meħtieġ se jaħli l-memorja, joħloq aktar konnessjonijiet idle, u jnaqqas ir-rata ta 'ġbir ta' konnessjoni. F'Lyft, il-kontenituri sidecar tal-mibgħut tagħna jaħdmu b'konkorrenza baxxa ħafna sabiex il-prestazzjoni taqbel bejn wieħed u ieħor mas-servizzi li joqogħdu magħhom. Aħna nħaddmu Envoy bħala prokura tarf biss fil-konkorrenza massima.

Xi jfisser non-imblukkar?

It-terminu "mhux imblukkar" intuża diversi drabi s'issa meta ġie diskuss kif jaħdmu l-ħjut prinċipali u tal-ħaddiem. Il-kodiċi kollu huwa miktub fuq is-suppożizzjoni li xejn qatt ma jkun imblukkat. Madankollu, dan mhux għal kollox minnu (x'inhu minnu għal kollox?).

Envoy juża diversi serraturi ta' proċess twil:

  • Kif diskuss, meta tikteb zkuk tal-aċċess, il-ħjut tal-ħaddiema kollha jakkwistaw l-istess lock qabel ma jimtela l-buffer tar-reġistru fil-memorja. Il-ħin taż-żamma tal-lock għandu jkun baxx ħafna, iżda huwa possibbli li l-lock jiġi kkontestat b'konkorrenza għolja u throughput għoli.
  • Envoy juża sistema kumplessa ħafna biex jimmaniġġja statistika li hija lokali għall-ħajta. Dan se jkun is-suġġett ta’ post separat. Madankollu, se nsemmi fil-qosor li bħala parti mill-ipproċessar tal-istatistika tal-ħajt lokalment, xi drabi huwa meħtieġ li tinkiseb serratura fuq "maħżen tal-istatistiċi" ċentrali. Dan l-illokkjar qatt m'għandu jkun meħtieġ.
  • Il-ħajt prinċipali perjodikament jeħtieġ li jikkoordina mal-ħjut tal-ħaddiema kollha. Dan isir billi "tippubblika" mill-ħajt prinċipali għall-ħjut tal-ħaddiem, u xi kultant mill-ħjut tal-ħaddiema lura għall-ħajt prinċipali. It-trażmissjoni teħtieġ lock sabiex il-messaġġ ippubblikat ikun jista' jitqiegħed fil-kju għal kunsinna aktar tard. Dawn is-serraturi qatt m'għandhom jiġu kkontestati serjament, iżda xorta jistgħu jiġu mblukkati teknikament.
  • Meta l-Envoy jikteb log fil-fluss ta 'żball tas-sistema (żball standard), jakkwista lock fuq il-proċess kollu. B'mod ġenerali, l-illoggjar lokali tal-Envoy huwa meqjus bħala terribbli mil-lat tal-prestazzjoni, għalhekk ma ngħatatx ​​ħafna attenzjoni għat-titjib tiegħu.
  • Hemm ftit serraturi każwali oħra, iżda l-ebda wieħed minnhom ma huwa kritiku għall-prestazzjoni u m'għandu qatt jiġi kkontestat.

Ħażna lokali tal-ħajt

Minħabba l-mod kif l-Envoy jifred ir-responsabbiltajiet tal-ħajt prinċipali mir-responsabbiltajiet tal-ħajt tal-ħaddiem, hemm rekwiżit li l-ipproċessar kumpless jista 'jsir fuq il-ħajt prinċipali u mbagħad jiġi pprovdut lil kull ħajt tal-ħaddiem b'mod konkorrenti ħafna. Din it-taqsima tiddeskrivi Envoy Thread Local Storage (TLS) f'livell għoli. Fit-taqsima li jmiss ser niddeskrivi kif tintuża biex timmaniġġja cluster.
[Traduzzjoni] Mudell tal-kamini tal-Mibgħut

Kif diġà deskritt, il-ħajt prinċipali jimmaniġġja prattikament il-funzjonalità kollha tal-pjan ta 'ġestjoni u kontroll fil-proċess tal-Mibgħut. Il-pjan ta 'kontroll huwa daqsxejn mgħobbi żżejjed hawn, iżda meta tħares lejha fi ħdan il-proċess tal-Mibgħut innifsu u tqabbel mal-kunsinna li jagħmlu l-ħjut tal-ħaddiem, jagħmel sens. Ir-regola ġenerali hija li l-proċess tal-ħajt prinċipali jagħmel xi xogħol, u mbagħad jeħtieġ li jaġġorna kull ħajt tal-ħaddiem skont ir-riżultat ta 'dak ix-xogħol. f'dan il-każ, il-ħajt tal-ħaddiem m'għandux għalfejn jakkwista lock fuq kull aċċess.

Is-sistema TLS (Ħżin lokali Thread) ta' Envoy taħdem kif ġej:

  • Il-kodiċi li jaħdem fuq il-ħajt prinċipali jista 'jalloka slot TLS għall-proċess kollu. Għalkemm dan huwa astratt, fil-prattika huwa indiċi f'vettur, li jipprovdi aċċess O(1).
  • Il-ħajta prinċipali tista 'tinstalla data arbitrarja fl-islott tagħha. Meta jsir dan, id-dejta tiġi ppubblikata lil kull ħajta tal-ħaddiem bħala avveniment normali ta' loop tal-avveniment.
  • Il-ħjut tal-ħaddiema jistgħu jaqraw mis-slot TLS tagħhom u jirkupraw kwalunkwe data lokali tal-ħajt disponibbli hemmhekk.

Għalkemm hija paradigma sempliċi ħafna u oerhört qawwija, hija simili ħafna għall-kunċett ta 'imblukkar RCU (Aqra-Kopja-Aġġornament). Essenzjalment, il-ħjut tal-ħaddiema qatt ma jaraw xi tibdil fid-dejta fl-islots TLS waqt li x-xogħol ikun qed jaħdem. Il-bidla sseħħ biss matul il-perjodu ta' mistrieħ bejn l-avvenimenti tax-xogħol.

Envoy juża dan b'żewġ modi differenti:

  • Billi taħżen data differenti fuq kull ħajta tal-ħaddiem, id-data tista 'tiġi aċċessata mingħajr ebda imblukkar.
  • Billi żżomm pointer kondiviż għal dejta globali fil-modalità ta 'qari biss fuq kull thread tal-ħaddiem. Għalhekk, kull ħajt tal-ħaddiem għandu għadd ta' referenza tad-dejta li ma jistax jitnaqqas waqt li x-xogħol ikun qed jaħdem. Huwa biss meta l-ħaddiema kollha jikkalmaw u jtellgħu dejta kondiviża ġdida li d-dejta l-antika tinqered. Dan huwa identiku għal RCU.

Il-kamini tal-aġġornament tal-cluster

F'din it-taqsima, ser niddeskrivi kif TLS (Ħżin lokali Thread) jintuża biex jimmaniġġja cluster. Il-ġestjoni tal-cluster tinkludi xDS API u/jew proċessar DNS, kif ukoll verifika tas-saħħa.
[Traduzzjoni] Mudell tal-kamini tal-Mibgħut

Il-ġestjoni tal-fluss tal-cluster tinkludi l-komponenti u l-passi li ġejjin:

  1. Il-Cluster Manager huwa komponent fi ħdan Envoy li jimmaniġġja l-upstreams tal-clusters magħrufa kollha, l-API tas-Servizz ta’ Skoperta tal-Cluster (CDS), is-Servizz ta’ Skoperta Sigriet (SDS) u l-APIs tas-Servizz ta’ Skoperta tal-Endpoint (EDS), DNS, u kontrolli tas-saħħa attivi. Huwa responsabbli għall-ħolqien ta' ħarsa "eventwalment konsistenti" ta' kull cluster upstream, li tinkludi hosts skoperti kif ukoll l-istat tas-saħħa.
  2. Il-kontrollur tas-saħħa jwettaq verifika tas-saħħa attiva u jirrapporta bidliet fl-istat tas-saħħa lill-maniġer tal-cluster.
  3. CDS (Servizz ta' Skoperta ta' Cluster) / SDS (Servizz ta' Skoperta Sigrieta) / EDS (Servizz ta' Skoperta ta' Endpoint) / DNS huma mwettqa biex jiddeterminaw is-sħubija fil-cluster. Il-bidla fl-istat tiġi rritornata lill-maniġer tal-cluster.
  4. Kull ħajta tal-ħaddiem tesegwixxi kontinwament ċirku tal-avveniment.
  5. Meta l-maniġer tal-cluster jiddetermina li l-istat għal cluster inbidel, huwa joħloq stampa ġdida ta' qari biss tal-istat tal-cluster u jibgħatha lil kull ħajta tal-ħaddiem.
  6. Matul il-perjodu kwiet li jmiss, il-ħajta tal-ħaddiem se taġġorna l-istampa fl-islott TLS allokat.
  7. Waqt avveniment I/O li suppost tiddetermina l-host għal tagħbija tal-bilanċ, il-load balancer se jitlob slot TLS (Ħżin lokali Thread) biex jikseb informazzjoni dwar il-host. Dan ma jeħtieġx serraturi. Innota wkoll li TLS jista 'wkoll jikkawża avvenimenti ta' aġġornament sabiex il-bilanċjanti tat-tagħbija u komponenti oħra jkunu jistgħu jikkalkulaw mill-ġdid il-caches, l-istrutturi tad-dejta, eċċ. Dan huwa lil hinn mill-ambitu ta 'din il-kariga, iżda jintuża f'diversi postijiet fil-kodiċi.

Bl-użu tal-proċedura ta' hawn fuq, Envoy jista' jipproċessa kull talba mingħajr ebda imblukkar (ħlief kif deskritt qabel). Minbarra l-kumplessità tal-kodiċi TLS innifsu, il-biċċa l-kbira tal-kodiċi m'għandux għalfejn jifhem kif jaħdem il-multithreading u jista 'jinkiteb b'ħajt wieħed. Dan jagħmel ħafna mill-kodiċi aktar faċli biex tikteb minbarra prestazzjoni superjuri.

Sottosistemi oħra li jagħmlu użu minn TLS

TLS (Ħżin lokali Thread) u RCU (Aqra l-Aġġornament tal-Kopja) jintużaw ħafna f'Envoy.

Eżempji ta 'użu:

  • Mekkaniżmu għall-bdil tal-funzjonalità waqt l-eżekuzzjoni: Il-lista attwali tal-funzjonalità attivata hija kkalkulata fil-fil prinċipali. Kull ħajt tal-ħaddiem imbagħad jingħata snapshot li jinqara biss bl-użu tas-semantika RCU.
  • Sostituzzjoni ta' tabelli tar-rotot: Għat-tabelli tar-rotot ipprovduti minn RDS (Route Discovery Service), it-tabelli tar-rotot huma maħluqa fuq il-ħajt prinċipali. L-istampa tal-qari biss se tiġi pprovduta sussegwentement lil kull ħajt tal-ħaddiem bl-użu tas-semantika RCU (Aqra l-Aġġornament tal-Kopja). Dan jagħmel it-tibdil tat-tabelli tar-rotot atomikament effiċjenti.
  • Caching tal-header HTTP: Kif jirriżulta, il-kalkolu tal-header HTTP għal kull talba (filwaqt li jkun qed jaħdem ~ 25K + RPS għal kull qalba) huwa pjuttost għoli. L-Envoy jikkalkula ċentralment l-header bejn wieħed u ieħor kull nofs sekonda u jipprovdiha lil kull ħaddiem permezz ta’ TLS u RCU.

Hemm każijiet oħra, iżda l-eżempji preċedenti għandhom jipprovdu fehim tajjeb ta’ għalxiex jintuża t-TLS.

In-nases tal-prestazzjoni magħrufa

Filwaqt li Envoy jaħdem pjuttost tajjeb b'mod ġenerali, hemm ftit oqsma notevoli li jeħtieġu attenzjoni meta jintuża b'konkorrenza u throughput għoljin ħafna:

  • Kif deskritt f'dan l-artikolu, bħalissa l-ħjut tal-ħaddiema kollha jiksbu lock meta jikteb fil-buffer tal-memorja tar-reġistru tal-aċċess. F'konkorrenza għolja u throughput għoli, ser ikollok bżonn tagħmel lott tar-reġistri tal-aċċess għal kull ħajta tal-ħaddiem għad-detriment tal-kunsinna barra mill-ordni meta tikteb fil-fajl finali. Alternattivament, tista 'toħloq log ta' aċċess separat għal kull thread tal-ħaddiem.
  • Għalkemm l-istatistika hija ottimizzata ħafna, f'konkorrenza u throughput għoljin ħafna x'aktarx se jkun hemm kontenzjoni atomika fuq statistika individwali. Is-soluzzjoni għal din il-problema hija counters għal kull ħajt tal-ħaddiem b'reset perjodiku tal-counters ċentrali. Dan se jiġi diskuss f'post sussegwenti.
  • L-arkitettura attwali ma taħdimx tajjeb jekk l-Envoy jiġi skjerat f'xenarju fejn hemm ftit konnessjonijiet li jeħtieġu riżorsi ta 'proċessar sinifikanti. M'hemm l-ebda garanzija li l-konnessjonijiet se jitqassmu b'mod ugwali fost il-ħjut tal-ħaddiema. Dan jista 'jiġi solvut bl-implimentazzjoni tal-ibbilanċjar tal-konnessjoni tal-ħaddiema, li se jippermetti l-iskambju ta' konnessjonijiet bejn il-ħjut tal-ħaddiema.

Konklużjoni

Il-mudell tal-kamin ta 'Envoy huwa ddisinjat biex jipprovdi faċilità ta' programmar u paralleliżmu massiv għad-detriment ta 'memorja u konnessjonijiet potenzjalment ta' ħela jekk mhux konfigurati b'mod korrett. Dan il-mudell jippermettilu li jaħdem tajjeb ħafna f'għadd ta 'ħajt u throughput għoli ħafna.
Kif semmejt fil-qosor fuq Twitter, id-disinn jista 'jmexxi wkoll fuq munzell sħiħ ta' netwerking tal-mod tal-utent bħal DPDK (Data Plane Development Kit), li jista 'jirriżulta f'servers konvenzjonali li jimmaniġġjaw miljuni ta' talbiet kull sekonda bi proċessar L7 sħiħ. Se jkun interessanti ħafna li tara x'jinbena fil-ftit snin li ġejjin.
L-aħħar kumment ta' malajr: Ġejt mistoqsi ħafna drabi għaliex għażilna C++ għall-Mibgħut. Ir-raġuni tibqa’ li għadha l-unika lingwa ta’ grad industrijali użata ħafna li fiha tista’ tinbena l-arkitettura deskritta f’din il-kariga. C++ żgur mhux adattat għall-proġetti kollha jew saħansitra ħafna, iżda għal ċerti każijiet ta 'użu għadu l-unika għodda biex isir ix-xogħol.

Links għall-kodiċi

Links għal fajls b'interfaces u implimentazzjonijiet ta' header diskussi f'din il-kariga:

Sors: www.habr.com

Żid kumment