Å is raksts man likÄs diezgan interesants, un tÄ kÄ Envoy visbiežÄk tiek izmantots kÄ daļa no āistioā vai vienkÄrÅ”i kÄ kubernetes āieejas kontrolierisā, lielÄkajai daļai cilvÄku ar to nav tÄdas tieÅ”as mijiedarbÄ«bas kÄ, piemÄram, ar tipisku Nginx vai Haproxy instalÄcijas. TomÄr, ja kaut kas saplÄ«st, bÅ«tu labi saprast, kÄ tas darbojas no iekÅ”puses. Es centos pÄc iespÄjas vairÄk teksta pÄrtulkot krieviski, arÄ« Ä«paÅ”us vÄrdus, tiem, kam uz to skatÄ«ties ir sÄpÄ«gi, oriÄ£inÄlus atstÄju iekavÄs. Laipni lÅ«dzam kaÄ·Ä«.
Zema lÄ«meÅa tehniskÄ dokumentÄcija Envoy kodu bÄzei paÅ”laik ir diezgan niecÄ«ga. Lai to novÄrstu, es plÄnoju izveidot virkni emuÄra ierakstu par dažÄdÄm Envoy apakÅ”sistÄmÄm. TÄ kÄ Å”is ir pirmais raksts, lÅ«dzu, dariet man zinÄmu, ko domÄjat un kas jÅ«s varÄtu interesÄt nÄkamajos rakstos.
Viens no visbiežÄk uzdotajiem tehniskajiem jautÄjumiem par Envoy ir lÅ«gt zema lÄ«meÅa aprakstu par izmantoto vÄ«tÅu modeli. Å ajÄ ziÅojumÄ es aprakstÄ«Å”u, kÄ Envoy kartÄ savienojumus ar pavedieniem, kÄ arÄ« Thread Local Storage sistÄmu, ko tÄ izmanto iekÅ”Äji, lai padarÄ«tu kodu paralÄlÄku un augstas veiktspÄjas.
VÄ«tÅu pÄrskats
Envoy izmanto trÄ«s dažÄdu veidu straumes:
Galvenais: Å is pavediens kontrolÄ procesa palaiÅ”anu un izbeigÅ”anu, visu XDS (xDiscovery Service) API apstrÄdi, tostarp DNS, stÄvokļa pÄrbaudi, vispÄrÄjo klasteru un izpildlaika pÄrvaldÄ«bu, statistikas atiestatÄ«Å”anu, administrÄÅ”anu un vispÄrÄjo procesu pÄrvaldÄ«bu ā Linux signÄlus. karstÄ restartÄÅ”ana utt. kas notiek Å”ajÄ pavedienÄ, ir asinhrons un "nebloÄ·ÄjoÅ”s". KopumÄ galvenais pavediens koordinÄ visus kritiskos funkcionalitÄtes procesus, kuru darbÄ«bai nav nepiecieÅ”ams liels CPU daudzums. Tas ļauj lielÄko daļu kontroles koda rakstÄ«t tÄ, it kÄ tas bÅ«tu ar vienu pavedienu.
StrÄdnieks: PÄc noklusÄjuma Envoy izveido darbinieka pavedienu katram sistÄmas aparatÅ«ras pavedienam, to var kontrolÄt, izmantojot opciju --concurrency. Katrs darbinieka pavediens palaiž ānebloÄ·ÄjoÅ”uā notikumu cilpu, kas ir atbildÄ«ga par katra klausÄ«tÄja noklausÄ«Å”anos; rakstÄ«Å”anas laikÄ (29. gada 2017. jÅ«lijÄ) nav klausÄ«tÄja sadalÄ«Å”anas, jaunu savienojumu pieÅemÅ”anas, filtru steka instantiances. savienojumu un visu ievades/izvades (IO) darbÄ«bu apstrÄdi savienojuma darbÄ«bas laikÄ. Atkal, tas ļauj lielÄko daļu savienojuma apstrÄdes koda rakstÄ«t tÄ, it kÄ tas bÅ«tu viens pavediens.
Failu skaloÅ”anas lÄ«dzeklis: Katram failam, ko Envoy raksta, galvenokÄrt piekļuves žurnÄliem, paÅ”laik ir neatkarÄ«gs bloÄ·ÄÅ”anas pavediens. Tas ir saistÄ«ts ar faktu, ka ierakstÄ«Å”ana failos, kas saglabÄti failu sistÄmÄ, pat tad, ja to lietojat O_NONBLOCK dažreiz var aizsprostot (nopÅ«ta). Kad darbinieka pavedieniem ir jÄraksta failÄ, dati faktiski tiek pÄrvietoti uz buferi atmiÅÄ, kur tie galu galÄ tiek izskaloti caur pavedienu. failu flush. Å is ir viens no koda apgabaliem, kurÄ tehniski visi darbinieku pavedieni var bloÄ·Ät vienu un to paÅ”u bloÄ·ÄÅ”anu, mÄÄ£inot aizpildÄ«t atmiÅas buferi.
Savienojuma apstrÄde
KÄ Ä«si minÄts iepriekÅ”, visi darbinieku pavedieni klausÄs visus klausÄ«tÄjus bez jebkÄdas ŔķelÅ”anÄs. TÄdÄjÄdi kodols tiek izmantots, lai graciozi nosÅ«tÄ«tu pieÅemtÄs ligzdas uz darbinieku pavedieniem. MÅ«sdienu kodoli parasti ir ļoti labi Å”ajÄ ziÅÄ, tie izmanto tÄdas funkcijas kÄ ievades/izvades (IO) prioritÄtes pastiprinÄÅ”ana, lai mÄÄ£inÄtu aizpildÄ«t pavedienu ar darbu, pirms tie sÄk izmantot citus pavedienus, kas arÄ« klausÄs tajÄ paÅ”Ä ligzdÄ, kÄ arÄ« neizmanto round robin. bloÄ·ÄÅ”ana (Spinlock), lai apstrÄdÄtu katru pieprasÄ«jumu.
Kad savienojums tiek pieÅemts darbinieka pavedienÄ, tas nekad neatstÄj Å”o pavedienu. Visa turpmÄkÄ savienojuma apstrÄde tiek pilnÄ«bÄ apstrÄdÄta darbinieka pavedienÄ, tostarp jebkura pÄrsÅ«tÄ«Å”anas darbÄ«ba.
Tam ir vairÄkas svarÄ«gas sekas:
Visi savienojumu pÅ«li programmÄ Envoy ir pieŔķirti darbinieka pavedienam. TÄtad, lai gan HTTP/2 savienojumu pÅ«li vienlaikus veido tikai vienu savienojumu ar katru augÅ”upÄjo resursdatoru, ja ir Äetri darbinieka pavedieni, stabilÄ stÄvoklÄ« katram augÅ”pus resursdatoram bÅ«s Äetri HTTP/2 savienojumi.
Iemesls, kÄpÄc Envoy darbojas Å”Ädi, ir tas, ka, saglabÄjot visu vienÄ darbinieka pavedienÄ, gandrÄ«z visu kodu var ierakstÄ«t bez bloÄ·ÄÅ”anas un tÄ, it kÄ tas bÅ«tu viens pavediens. Å is dizains ļauj viegli uzrakstÄ«t daudz koda un neticami labi mÄrogot lÄ«dz gandrÄ«z neierobežotam skaitam darbinieku pavedienu.
TomÄr viens no galvenajiem aspektiem ir tas, ka no atmiÅas baseina un savienojuma efektivitÄtes viedokļa patiesÄ«bÄ ir ļoti svarÄ«gi konfigurÄt --concurrency. Ja ir vairÄk darbinieku pavedienu, nekÄ nepiecieÅ”ams, tiks iztÄrÄta atmiÅa, tiks izveidots vairÄk dÄ«kstÄves savienojumu un samazinÄsies savienojumu apkopoÅ”anas Ätrums. UzÅÄmums Lyft mÅ«su sÅ«tÅa blakusvÄÄ£u konteineri darbojas ar ļoti zemu vienlaicÄ«gumu, tÄpÄc veiktspÄja aptuveni atbilst pakalpojumiem, kuriem tie atrodas blakus. MÄs palaižam Envoy kÄ malas starpniekserveri tikai maksimÄli vienlaicÄ«gi.
Ko nozÄ«mÄ nebloÄ·ÄÅ”ana?
Termins "nebloÄ·ÄÅ”ana" lÄ«dz Å”im ir izmantots vairÄkas reizes, apspriežot galveno un darba pavedienu darbÄ«bu. Viss kods ir rakstÄ«ts, pieÅemot, ka nekas nekad nav bloÄ·Äts. TomÄr tÄ nav pilnÄ«ga taisnÄ«ba (kas nav pilnÄ«gi taisnÄ«ba?).
Envoy izmanto vairÄkas ilgstoÅ”as āāāāprocesa bloÄ·ÄÅ”anas:
KÄ minÄts, rakstot piekļuves žurnÄlus, visi darbinieka pavedieni iegÅ«st vienu un to paÅ”u bloÄ·ÄÅ”anu, pirms tiek aizpildÄ«ts atmiÅÄ esoÅ”Ä Å¾urnÄla buferis. SlÄdzenes turÄÅ”anas laikam jÄbÅ«t ļoti zemam, taÄu ir iespÄjams, ka slÄdzeni var apstrÄ«dÄt ar augstu vienlaicÄ«gumu un lielu caurlaidspÄju.
Envoy izmanto ļoti sarežģītu sistÄmu, lai apstrÄdÄtu statistiku, kas ir lokÄla pavedienam. TÄ bÅ«s atseviŔķa ieraksta tÄma. TomÄr es Ä«si pieminÄÅ”u, ka, apstrÄdÄjot pavedienu statistiku lokÄli, dažkÄrt ir jÄiegÄdÄjas centrÄlÄ "statistikas veikala" atslÄga. Å o bloÄ·ÄÅ”anu nekad nevajadzÄtu pieprasÄ«t.
Galvenais pavediens periodiski jÄsaskaÅo ar visiem darbinieka pavedieniem. Tas tiek darÄ«ts, "publicÄjot" no galvenÄ pavediena uz darbinieku pavedieniem un dažreiz no darbinieka pavedieniem atpakaļ uz galveno pavedienu. SÅ«tÄ«Å”anai ir nepiecieÅ”ama bloÄ·ÄÅ”ana, lai publicÄto ziÅojumu varÄtu ievietot rindÄ vÄlÄkai piegÄdei. Å Ä«s slÄdzenes nekad nevajadzÄtu nopietni apstrÄ«dÄt, taÄu tÄs joprojÄm var tehniski bloÄ·Ät.
Kad Envoy ieraksta žurnÄlu sistÄmas kļūdu straumÄ (standarta kļūda), tas iegÅ«st bloÄ·ÄÅ”anu visam procesam. KopumÄ Envoy vietÄjÄ mežizstrÄde tiek uzskatÄ«ta par briesmÄ«gu no veiktspÄjas viedokļa, tÄpÄc tÄs uzlaboÅ”anai nav pievÄrsta liela uzmanÄ«ba.
Ir dažas citas nejauÅ”as slÄdzenes, taÄu nevienai no tÄm nav bÅ«tiskas veiktspÄjas, un tÄs nekad nevajadzÄtu apstrÄ«dÄt.
Pavedienu lokÄlÄ krÄtuve
TÄ kÄ sÅ«tnis nodala galvenÄ pavediena pienÄkumus no darbinieka pavediena pienÄkumiem, pastÄv prasÄ«ba, ka galvenajÄ pavedienÄ var veikt sarežģītu apstrÄdi un pÄc tam nodroÅ”inÄt to katram darbinieka pavedienam ļoti vienlaicÄ«gi. Å ajÄ sadaÄ¼Ä ir aprakstÄ«ta sÅ«tÅa pavediena vietÄjÄ krÄtuve (TLS) augstÄ lÄ«menÄ«. NÄkamajÄ sadaÄ¼Ä es aprakstÄ«Å”u, kÄ tas tiek izmantots klastera pÄrvaldÄ«Å”anai.
KÄ jau aprakstÄ«ts, galvenais pavediens apstrÄdÄ praktiski visas vadÄ«bas un vadÄ«bas plaknes funkcionalitÄtes sÅ«tÅa procesÄ. Å eit vadÄ«bas plakne ir nedaudz pÄrslogota, taÄu, aplÅ«kojot to paÅ”Ä sÅ«tÅa procesÄ un salÄ«dzinot to ar pÄrsÅ«tÄ«Å”anu, ko veic darbinieka pavedieni, tas ir loÄ£iski. VispÄrÄjais noteikums ir tÄds, ka galvenÄ pavediena process veic noteiktu darbu, un pÄc tam tam ir jÄatjaunina katrs darbinieka pavediens atbilstoÅ”i Ŕī darba rezultÄtam. Å”ajÄ gadÄ«jumÄ darbinieka pavedienam nav jÄiegÅ«st bloÄ·ÄÅ”ana katrai piekļuvei.
SÅ«tÅa TLS (pavedienu lokÄlÄ krÄtuve) sistÄma darbojas Å”Ädi:
Kods, kas darbojas galvenajÄ pavedienÄ, var pieŔķirt TLS slotu visam procesam. Lai gan tas ir abstrahÄts, praksÄ tas ir vektora indekss, kas nodroÅ”ina O(1) piekļuvi.
Galvenais pavediens savÄ slotÄ var instalÄt patvaļīgus datus. Kad tas ir izdarÄ«ts, dati tiek publicÄti katrÄ darbinieka pavedienÄ kÄ parasts notikumu cilpas notikums.
Darbinieku pavedieni var lasÄ«t no sava TLS slota un izgÅ«t visus tajÄ pieejamos pavedienu lokÄlos datus.
Lai gan tÄ ir ļoti vienkÄrÅ”a un neticami spÄcÄ«ga paradigma, tÄ ir ļoti lÄ«dzÄ«ga RCU (lasÄ«Å”anas-kopÄÅ”anas-atjauninÄÅ”anas) bloÄ·ÄÅ”anas koncepcijai. BÅ«tÄ«bÄ darbinieku pavedieni nekad neredz datu izmaiÅas TLS slotos, kamÄr darbs darbojas. IzmaiÅas notiek tikai atpÅ«tas periodÄ starp darba notikumiem.
SÅ«tnis to izmanto divos dažÄdos veidos:
SaglabÄjot dažÄdus datus katrÄ darbinieka pavedienÄ, datiem var piekļūt bez jebkÄdas bloÄ·ÄÅ”anas.
Uzturot koplietotu rÄdÄ«tÄju uz globÄlajiem datiem tikai lasÄ«Å”anas režīmÄ katrÄ darbinieka pavedienÄ. TÄdÄjÄdi katram darbinieka pavedienam ir datu atsauces skaits, ko nevar samazinÄt, kamÄr darbs darbojas. Tikai tad, kad visi darbinieki nomierinÄsies un augÅ”upielÄdÄs jaunus kopÄ«gotos datus, vecie dati tiks iznÄ«cinÄti. Tas ir identisks RCU.
Klasteru atjauninÄÅ”anas pavedienu veidoÅ”ana
Å ajÄ sadaÄ¼Ä es aprakstÄ«Å”u, kÄ TLS (pavedienu lokÄlÄ krÄtuve) tiek izmantots klastera pÄrvaldÄ«bai. Klasteru pÄrvaldÄ«ba ietver xDS API un/vai DNS apstrÄdi, kÄ arÄ« veselÄ«bas pÄrbaudi.
Klasteru plÅ«smas pÄrvaldÄ«ba ietver Å”Ädus komponentus un darbÄ«bas:
Klasteru pÄrvaldnieks ir sÅ«tÅa komponents, kas pÄrvalda visas zinÄmÄs klasteru augÅ”puses, klasteru atklÄÅ”anas pakalpojuma (CDS) API, slepenÄ atklÄÅ”anas pakalpojuma (SDS) un galapunkta noteikÅ”anas pakalpojuma (EDS) API, DNS un aktÄ«vÄs ÄrÄjÄs pÄrbaudes. Tas ir atbildÄ«gs par "galu galÄ konsekventa" skata izveidi par katru augÅ”upÄjo klasteru, kas ietver atklÄtos saimniekdatorus, kÄ arÄ« veselÄ«bas stÄvokli.
VeselÄ«bas pÄrbaudÄ«tÄjs veic aktÄ«vo veselÄ«bas pÄrbaudi un ziÅo par veselÄ«bas stÄvokļa izmaiÅÄm klastera pÄrvaldniekam.
CDS (klasteru noteikÅ”anas pakalpojums) / SDS (slepenais meklÄÅ”anas pakalpojums) / EDS (gala punkta noteikÅ”anas pakalpojums) / DNS tiek veikti, lai noteiktu klastera dalÄ«bu. StÄvokļa izmaiÅas tiek atgrieztas klastera pÄrvaldniekam.
Katrs darbinieka pavediens nepÄrtraukti izpilda notikumu cilpu.
Kad klastera pÄrvaldnieks nosaka, ka klastera stÄvoklis ir mainÄ«jies, tas izveido jaunu tikai lasÄmu klastera stÄvokļa momentuzÅÄmumu un nosÅ«ta to katram darbinieka pavedienam.
I/O notikuma laikÄ, kam ir jÄnosaka resursdatora slodzes lÄ«dzsvars, slodzes lÄ«dzsvarotÄjs pieprasÄ«s TLS (pavedienu lokÄlÄs atmiÅas) slotu, lai iegÅ«tu informÄciju par resursdatoru. Tam nav nepiecieÅ”amas slÄdzenes. Å emiet vÄrÄ arÄ« to, ka TLS var arÄ« aktivizÄt atjauninÄÅ”anas notikumus, lai slodzes balansÄtÄji un citi komponenti varÄtu pÄrrÄÄ·inÄt keÅ”atmiÅas, datu struktÅ«ras utt. Tas ir Ärpus Ŕīs ziÅas darbÄ«bas jomas, taÄu tiek izmantots dažÄdÄs koda vietÄs.
Izmantojot iepriekÅ” minÄto procedÅ«ru, sÅ«tnis var apstrÄdÄt katru pieprasÄ«jumu bez jebkÄdas bloÄ·ÄÅ”anas (izÅemot gadÄ«jumus, kas aprakstÄ«ti iepriekÅ”). NeatkarÄ«gi no paÅ”a TLS koda sarežģītÄ«bas, lielÄkajai daļai koda nav jÄsaprot, kÄ darbojas daudzpavedienu izveide, un to var rakstÄ«t vienÄ pavedienÄ. Tas padara lielÄko daļu koda vieglÄk ierakstÄmu, kÄ arÄ« nodroÅ”ina izcilu veiktspÄju.
Citas apakÅ”sistÄmas, kas izmanto TLS
TLS (pavedienu lokÄlÄ krÄtuve) un RCU (lasÄ«Å”anas kopijas atjauninÄjums) tiek plaÅ”i izmantoti programmÄ Envoy.
LietoÅ”anas piemÄri:
MehÄnisms funkcionalitÄtes maiÅai izpildes laikÄ: PaÅ”reizÄjais iespÄjoto funkcionalitÄtes saraksts tiek aprÄÄ·inÄts galvenajÄ pavedienÄ. PÄc tam katram darbinieka pavedienam tiek pieŔķirts tikai lasÄms momentuzÅÄmums, izmantojot RCU semantiku.
MarÅ”ruta tabulu nomaiÅa: marÅ”ruta tabulÄm, ko nodroÅ”ina RDS (marÅ”ruta noteikÅ”anas pakalpojums), marÅ”ruta tabulas tiek izveidotas galvenajÄ pavedienÄ. Tikai lasÄms momentuzÅÄmums pÄc tam tiks nodroÅ”inÄts katram darbinieka pavedienam, izmantojot RCU (lasÄ«Å”anas kopÄÅ”anas atjauninÄjuma) semantiku. Tas padara marÅ”ruta tabulu maiÅu atomiski efektÄ«vu.
HTTP galvenes keÅ”atmiÅa: KÄ izrÄdÄs, HTTP galvenes aprÄÄ·inÄÅ”ana katram pieprasÄ«jumam (palaižot ~25K+ RPS uz kodolu) ir diezgan dÄrga. Envoy centralizÄti aprÄÄ·ina galveni aptuveni ik pÄc pussekundes un nodroÅ”ina to katram darbiniekam, izmantojot TLS un RCU.
Ir arÄ« citi gadÄ«jumi, taÄu iepriekÅ”Äjiem piemÄriem vajadzÄtu sniegt labu izpratni par to, kam tiek izmantots TLS.
ZinÄmas veiktspÄjas nepilnÄ«bas
Lai gan Envoy kopumÄ darbojas diezgan labi, ir dažas ievÄrojamas jomas, kurÄm jÄpievÄrÅ” uzmanÄ«ba, ja to lieto ar ļoti augstu vienlaicÄ«gumu un caurlaidspÄju:
KÄ aprakstÄ«ts Å”ajÄ rakstÄ, paÅ”laik visi darbinieka pavedieni iegÅ«st bloÄ·ÄÅ”anu, rakstot piekļuves žurnÄla atmiÅas buferÄ«. Augstas vienlaicÄ«bas un lielas caurlaidspÄjas gadÄ«jumÄ, rakstot galÄ«gajÄ failÄ, piekļuves žurnÄli bÅ«s jÄsagrupÄ katram darbinieka pavedienam uz ÄrpuskÄrtas piegÄdes rÄÄ·ina. Varat arÄ« izveidot atseviŔķu piekļuves žurnÄlu katram darbinieka pavedienam.
Lai gan statistika ir ļoti optimizÄta, ar ļoti augstu vienlaicÄ«gumu un caurlaidspÄju, iespÄjams, radÄ«sies strÄ«ds par atseviŔķu statistiku. Å Ä«s problÄmas risinÄjums ir skaitÄ«tÄji katram darbinieka pavedienam ar periodisku centrÄlo skaitÄ«tÄju atiestatÄ«Å”anu. Tas tiks apspriests nÄkamajÄ ierakstÄ.
PaÅ”reizÄjÄ arhitektÅ«ra nedarbosies labi, ja Envoy tiks izvietots scenÄrijÄ, kurÄ ir ļoti maz savienojumu, kuriem nepiecieÅ”ami ievÄrojami apstrÄdes resursi. Nav garantijas, ka savienojumi tiks vienmÄrÄ«gi sadalÄ«ti starp darba vÄ«tnÄm. To var atrisinÄt, ievieÅ”ot strÄdnieku savienojumu balansÄÅ”anu, kas ļaus apmainÄ«ties ar savienojumiem starp strÄdnieku pavedieniem.
SecinÄjums
Envoy vÄ«tÅu modelis ir izstrÄdÄts, lai nodroÅ”inÄtu vieglu programmÄÅ”anu un masveida paralÄlismu uz potenciÄli izŔķÄrdÄ«gas atmiÅas un savienojumu rÄÄ·ina, ja tas nav pareizi konfigurÄts. Å is modelis ļauj tam ļoti labi darboties ar ļoti lielu pavedienu skaitu un caurlaidspÄju.
KÄ jau Ä«si minÄju vietnÄ Twitter, dizains var darboties arÄ« pilna lietotÄja režīma tÄ«kla steksÄ, piemÄram, DPDK (Data Plane Development Kit), kÄ rezultÄtÄ parastie serveri apstrÄdÄ miljoniem pieprasÄ«jumu sekundÄ ar pilnu L7 apstrÄdi. BÅ«s ļoti interesanti redzÄt, kas tiks uzbÅ«vÄts tuvÄko gadu laikÄ.
PÄdÄjais Ä«ss komentÄrs: man daudzas reizes ir jautÄts, kÄpÄc mÄs izvÄlÄjÄmies C++ priekÅ” Envoy. Iemesls joprojÄm ir tÄds, ka tÄ joprojÄm ir vienÄ«gÄ plaÅ”i izmantotÄ industriÄlÄ lÄ«meÅa valoda, kurÄ var uzbÅ«vÄt Å”ajÄ amatÄ aprakstÄ«to arhitektÅ«ru. C++ noteikti nav piemÄrots visiem vai pat daudziem projektiem, taÄu noteiktiem lietoÅ”anas gadÄ«jumiem tas joprojÄm ir vienÄ«gais rÄ«ks, lai paveiktu darbu.
Saites uz kodu
Saites uz failiem ar interfeisiem un galveÅu ievieÅ”anu, kas apspriesti Å”ajÄ ziÅojumÄ: