[Werger] Modela kêşana şandî

Wergera gotarê: Modela threading nûner - https://blog.envoyproxy.io/envoy-threading-model-a8d44b922310

Min ev gotara pir balkêş dît, û ji ber ku Envoy pir caran wekî beşek "istio" an jî tenê wekî "kontrolkerê têketinê" ya kubernetes tê bikar anîn, pir kes bi wê re heman têkiliya rasterast bi wê re nînin, wekî mînak, bi tîpîk. Sazkirinên Nginx an Haproxy. Lêbelê, heke tiştek bişkîne, dê baş be ku meriv fêm bike ka ew ji hundur çawa dixebite. Min hewl da ku bi qasî ku pêkan be ji nivîsê wergerînim rûsî, di nav de peyvên taybetî jî; ji bo kesên ku dîtina vê yekê bi êş dibînin, min orîjînal di nav parantezê de hiştin. Bi xêr hatî pisîkê.

Belgeyên teknîkî yên kêm-asta ji bo bingeha koda Envoy niha pir kêm e. Ji bo çareserkirina vê, ez plan dikim ku rêzek postên blogê li ser bine pergalên cihêreng ên Envoy bikim. Ji ber ku ev gotara yekem e, ji kerema xwe ji min re bihêle ka hûn çi difikirin û dibe ku hûn di gotarên pêşerojê de bi çi re eleqedar bibin.

Yek ji pirsên teknîkî yên herî gelemperî ku ez di derbarê Envoy de distînim ev e ku ji bo ravekirinek nizm a modela tîrêjê ya ku ew bikar tîne dipirsim. Di vê postê de, ez ê diyar bikim ka Envoy çawa pêwendiyan bi mijaran re nexşe dike, û her weha Pergala Hilgirtina Herêmî ya Thread ku ew di hundurê de bikar tîne da ku kodê bêtir paralel û performansa bilind çêbike.

Pêşniyara Threading

[Werger] Modela kêşana şandî

Envoy sê cûreyên cûda yên çeman bikar tîne:

  • Ser: Ev mijar destpêkirin û bidawîbûna pêvajoyê, hemî pêvajokirina XDS (Xizmeta xDiscovery) API-yê, di nav de DNS, kontrolkirina tenduristiyê, rêveberiya koma giştî û dema xebitandinê, vesazkirina statîstîkan, rêveberî û rêveberiya pêvajoya giştî - îşaretên Linux-ê kontrol dike. Ji nû ve destpêkirina germ, hwd. di vê mijarê de diqewime asînkron û "ne-astengker" e. Bi gelemperî, mijara sereke hemî pêvajoyên fonksiyonên krîtîk ên ku ji bo xebitandina mîqdarek mezin a CPU-yê hewce nake koordîne dike. Ev dihêle ku piraniya koda kontrolê wekî ku ew yek xêzkirî be were nivîsandin.
  • Karker: Ji hêla xwerû, Envoy ji bo her xêza hardware di pergalê de mijarek karker diafirîne, ev dikare bi vebijarkê were kontrol kirin --concurrency. Her tîra xebatkar pêlek bûyerek "ne-asteng" dimeşîne, ku berpirsiyarê guhdarîkirina her guhdarek e; di dema nivîsandinê de (29 Tîrmeh 2017) ji guhdarvanan re parvekirin tune, girêdanên nû qebûl dikin, ji bo stûnek fîlterê destnîşan dikin. girêdan, û pêvajoyên hemî operasyonên têketin / derketinê (IO) di dema jiyana girêdanê de. Dîsa, ev dihêle ku piraniya koda destwerdana girêdanê wekî ku ew yek xêzkirî be were nivîsandin.
  • Paqijkirina pelan: Her pelê ku Envoy dinivîse, bi giranî têketinên gihîştinê, niha xwedan mijarek astengkirina serbixwe ye. Ev ji ber vê yekê ye ku nivîsandina pelên ku ji hêla pergala pelan ve hatî girtin jî dema ku tê bikar anîn O_NONBLOCK carinan dikare were asteng kirin (axîn). Dema ku mijarên xebatkar hewce ne ku li pelek binivîsin, dane bi rastî berbi tamponek di bîranînê de tê veguheztin ku di dawiyê de di nav mijarê de tê şûştin. rijandina pelê. Ev yek qada kodê ye ku ji hêla teknîkî ve hemî mijarên karker dikarin heman qeflê asteng bikin dema ku hewl didin ku tamponek bîranînê tije bikin.

Desthilatdariya girêdanê

Wekî ku li jor bi kurtî hate nîqaş kirin, hemî mijarên xebatkar bêyî parvekirinê li hemî guhdaran guhdarî dikin. Bi vî rengî, kernel tê bikar anîn ku bi dilşewatî soketên pejirandî ji mijarên karker re bişîne. Kernelên nûjen bi gelemperî di vê yekê de pir baş in, ew taybetmendiyên mîna zêdekirina pêşîniya têketin/derketinê (IO) bikar tînin da ku hewl bidin ku mijarek bi kar tijî bikin berî ku ew dest bi karanîna mijarên din ên ku di heman soketê de jî guhdarî dikin, bikar bînin, û di heman demê de dorhêl bikar neynin. girtina (Spinlock) ji bo pêvajoya her daxwazek.
Gava ku têkiliyek li ser xêzek karker were pejirandin, ew çu carî ji wê mijarê dernakeve. Hemî pêvajoyek pêvek a pêwendiyê bi tevahî di xêza xebatkar de, tevî her tevgerek şandinê, tê rêve kirin.

Ev çend encamên girîng hene:

  • Hemî hewzên pêwendiyê yên li Envoy ji xelekek karker re têne destnîşan kirin. Ji ber vê yekê, her çend hewzên pêwendiya HTTP/2 bi carekê re tenê yek pêwendiyê bi her mêvandarê jorîn re çêdikin, heke çar mijarên xebatkar hebin, dê di rewşek domdar de çar girêdanên HTTP/2 ji her mêvandarê jorîn re hebin.
  • Sedema ku Envoy bi vî rengî dixebite ev e ku bi girtina her tiştî li ser yek xêzek xebatkar, hema hema hemî kod dikare bêyî astengkirinê were nivîsandin û mîna ku ew yek têle be. Vê sêwiranê nivîsandina gelek kodan hêsan dike û bi qasî hejmareke bêsînor ji mijarên xebatkar re pir baş pîvan dike.
  • Lêbelê, yek ji rêgezên sereke ev e ku ji hêla hewza bîranînê û pêwendiya pêwendiyê ve, bi rastî pir girîng e ku meriv mîheng bike. --concurrency. Hebûna mijarên xebatkar ên ji hewcedariyê zêdetir dê bîranînê winda bike, bêtir girêdanên bêkar biafirîne, û rêjeya berhevkirina girêdanê kêm bike. Li Lyft, konteynerên kêlekê yên nûnerê me bi hevdemiyek pir kêm dimeşin da ku performans bi karûbarên ku ew li tenişta wan rûniştine bi qasî hevûdu bişibînin. Em Envoy tenê di hevdemiya herî zêde de wekî proxyek qerax dimeşînin.

Ne-astengkirin tê çi wateyê?

Têgîna "ne-astengkirin" heya nuha çend caran hatîye bikar anîn dema ku tê nîqaş kirin ka xetên sereke û xebatkar çawa dixebitin. Hemî kod li ser vê yekê hatî nivîsandin ku tiştek qet nayê asteng kirin. Lêbelê, ev bi tevahî ne rast e (çi bi tevahî ne rast e?).

Envoy gelek kilîdên pêvajoya dirêj bikar tîne:

  • Wekî ku hate nîqaş kirin, dema ku têketinên gihîştinê dinivîsin, hemî mijarên xebatkar heman qeflê digirin berî ku tampona têketinê ya nav-bîrê were dagirtin. Pêdivî ye ku dema girtina qeflê pir kêm be, lê mimkun e ku kilît bi hevdemî û berbiçûkek bilind re were pêşbaz kirin.
  • Envoy pergalek pir tevlihev bikar tîne da ku statîstîkên ku li ser mijarê herêmî ne bi rê ve bibe. Ev dê bibe mijara gotarek cuda. Lêbelê, ez ê bi kurtasî behs bikim ku wekî beşek ji hilberandina statîstîkên mijarên herêmî, carinan hewce ye ku meriv li ser "firoşgehek statîstîkan" a navendî bigire. Divê ev kilît qet hewce nebe.
  • Mijara sereke bi demkî pêdivî ye ku bi hemî mijarên xebatkar re hevrêz bike. Ev yek bi "weşandina" ji mijara sereke ber bi mijarên xebatkar ve, û carinan jî ji mijarên xebatkar vedigere mijara sereke. Ji şandinê re qeflek hewce dike da ku peyama hatî weşandin ji bo radestkirina paşê were rêz kirin. Divê ev kilît qet bi ciddî neyên nakok kirin, lê dîsa jî ew dikarin teknîkî bêne asteng kirin.
  • Dema ku Envoy têketinek li ser çemê xeletiya pergalê (çewtiya standard) dinivîse, ew li ser tevahiya pêvajoyê qeflek digire. Bi gelemperî, têketina herêmî ya Envoy ji hêla performansê ve tirsnak tê hesibandin, ji ber vê yekê zêde guh nedane başkirina wê.
  • Çend kilîtkirinên din ên bêserûber hene, lê yek ji wan performansê krîtîk nîn e û divê çu carî neyên ceribandin.

Mijara hilanîna herêmî

Ji ber awayê ku Envoy berpirsiyariyên mijara sereke ji berpirsiyariyên mijara xebatkar ji hev vediqetîne, pêdivî ye ku pêvajoyek tevlihev li ser mijara sereke were kirin û dûv re bi rengek pir hevdem ji her mijarê re were peyda kirin. Ev beş di astek bilind de Envoy Thread Local Storage (TLS) vedibêje. Di beşa paşîn de ez ê diyar bikim ka ew çawa ji bo birêvebirina komekê tê bikar anîn.
[Werger] Modela kêşana şandî

Wekî ku berê hatî behs kirin, mijara sereke hema hema hemî fonksiyonên balafirê yên rêveberî û kontrolê di pêvajoya Envoy de digire. Balafira kontrolê li vir hinekî zêde barkirî ye, lê gava ku hûn di hundurê pêvajoya Envoy bixwe de lê mêze dikin û wê bi şandina ku têlên xebatkar dikin re berhev dikin, ew têgihîştî ye. Rêbaza gelemperî ev e ku pêvajoya tîrêjê ya sereke hin karan dike, û dûv re ew hewce dike ku her mijara xebatkar li gorî encama wê xebatê nûve bike. di vê rewşê de, xêza karker ne hewce ye ku li ser her gihîştinê qeflek bidest bixe.

Pergala TLS (hilberîna herêmî ya Mijarê) ya Envoy wiha dixebite:

  • Koda ku li ser mijara sereke dimeşe dikare ji bo tevahiya pêvajoyê hêlînek TLS veqetîne. Her çend ev razber be jî, di pratîkê de ew nîşanek vektorek e, gihîştina O(1) peyda dike.
  • Mijara sereke dikare daneyên keyfî li hêlîna xwe saz bike. Dema ku ev tê kirin, dane ji her tîra xebatkar re wekî bûyerek lûleya bûyera normal tê weşandin.
  • Mijarên xebatkar dikarin ji hêlîna xwe ya TLS bixwînin û her data-herêmî ya ku li wir peyda dibin bistînin.

Her çend ew paradîgmayek pir hêsan û pir bi hêz e, ew pir dişibihe têgîna astengkirina RCU (Bixwîne-Copy-Nûvekirin). Di bingeh de, mijarên karker di dema ku kar dimeşe qet guheztinên daneyê di hêlînên TLS de nabînin. Guhertin tenê di dema bêhnvedanê de di navbera bûyerên xebatê de pêk tê.

Envoy vê yekê bi du awayên cûda bikar tîne:

  • Bi hilanîna daneyên cihêreng li ser her tîra xebatkar, dikare bêyî astengkirinê bigihîje daneyan.
  • Bi domandina nîşanek hevpar a daneya gerdûnî di moda tenê-xwendinê de li ser her tîra xebatkar. Bi vî rengî, her tîra karker xwedan hejmarek referansa daneyê ye ku dema ku kar dimeşe nayê kêm kirin. Tenê gava ku hemî xebatkar aram bibin û daneyên nû yên hevpar barkirin dê daneyên kevn werin hilweşandin. Ev bi RCU re wekhev e.

Mijara nûvekirina komê

Di vê beşê de, ez ê diyar bikim ka TLS (hilberîna herêmî ya Mijarê) çawa tê bikar anîn ji bo birêvebirina komek. Rêvebiriya komê xDS API û/an pêvajoyek DNS, û hem jî kontrolkirina tenduristiyê vedigire.
[Werger] Modela kêşana şandî

Rêvebiriya herikîna komê pêkhate û gavên jêrîn pêk tîne:

  1. Rêvebirê Clusterê pêkhateyek e di nav Envoy de ku hemî rêyên jorîn ên komê yên naskirî, API-ya Karûbarê Vedîtina Cluster (CDS), API-yên Karûbarê Vedîtina Veşartî (SDS) û Karûbarê Vedîtina Endpoint (EDS), DNS, û kontrolên derveyî yên çalak birêve dibe. Kontrolkirina tenduristiyê. Ew berpirsiyar e ji bo afirandina nerînek "di dawiyê de domdar" a her komika jorîn, ku tê de mêvandarên keşifkirî û hem jî rewşa tenduristiyê vedihewîne.
  2. Kontrolkerê tenduristiyê kontrolek tenduristî ya çalak dike û guheztinên rewşa tenduristiyê ji rêveberê komê re radigihîne.
  3. CDS (Xizmeta Vedîtina Komê) / SDS (Xizmeta Vedîtina Veşartî) / EDS (Xizmeta Vedîtina Endpoint) / DNS ji bo destnîşankirina endametiya komê têne kirin. Guhertina dewletê ji rêveberê komê re tê vegerandin.
  4. Her Mijara xebatkar bi domdarî qelekek bûyerê pêk tîne.
  5. Dema ku gerînendeyê komê destnîşan dike ku rewşa komekê guherî ye, ew wêneyek nû ya tenê-xwendinî ya rewşa komê diafirîne û wê ji her tîra xebatkar re dişîne.
  6. Di heyama bêdeng a din de, xêza karker dê wêneyê di hêlîna TLS ya veqetandî de nûve bike.
  7. Di dema bûyerek I/O ya ku tê xwestin ku mêvandarê barkirina hevsengiyê diyar bike, balansa barkirinê dê hêlînek TLS (hilberîna herêmî ya Mijarê) bixwaze da ku agahdariya li ser mêvandar bistîne. Ev kilît hewce nake. Di heman demê de bala xwe bidin ku TLS di heman demê de dikare bûyerên nûvekirinê jî bişopîne da ku hevsengên barkirinê û pêkhateyên din bikarin kaş, strukturên daneyê, hwd ji nû ve hesab bikin. Ev li derveyî çarçoveya vê postê ye, lê di kodê de li cîhên cihê tê bikar anîn.

Bi karanîna prosedûra jorîn, Envoy dikare her daxwazek bêyî astengkirinê bişopîne (ji bilî wekî ku berê hatî destnîşan kirin). Ji xeynî tevliheviya koda TLS bixwe, piraniya kodê ne hewce ye ku fêm bikin ka çiqas pirzimanî çawa dixebite û dikare bi yek-têkilî were nivîsandin. Ev ji bilî performansa bilindtir nivîsandina piraniya kodê hêsantir dike.

Binsîstemên din ên ku TLS bikar tînin

TLS (hilberîna herêmî ya Mijarê) û RCU (Nûvekirina Kopê Bixwîne) bi berfirehî di Envoy de têne bikar anîn.

Nimûneyên karanîna:

  • Mekanîzmaya guhertina fonksiyonê di dema darvekirinê de: Lîsteya heyî ya fonksiyonên çalakkirî di mijara sereke de tê hesibandin. Dûv re bi karanîna semantîkên RCU re wêneyek tenê-xwendewar tê dayîn.
  • Li şûna tabloyên rê: Ji bo tabloyên rêgezê yên ku ji hêla RDS (Xizmeta Vedîtina Rêyê) ve têne peyda kirin, tabloyên rêgezê li ser mijara sereke têne çêkirin. Dê paşê wêneya tenê-xwendinê bi karanîna semantîkên RCU (Nûvekirina Kopî Bixwîne) ji her xêza xebatkar re were peyda kirin. Ev guheztina tabloyên rêgezê bi atomî bandorker dike.
  • Veşartina sernavê HTTP: Wekî ku diqewime, hesabkirina sernavê HTTP ji bo her daxwazek (dema ku ~ 25K+ RPS li ser bingehê dimeşîne) pir biha ye. Envoy bi merkezî sernavê hema hema her nîv saniyeyekê hesab dike û bi TLS û RCU re ji her karkerî re peyda dike.

Bûyerên din hene, lê mînakên berê divê têgihiştinek baş peyda bikin ka TLS ji bo çi tê bikar anîn.

Kêliyên performansê yên naskirî

Dema ku Envoy bi tevayî pir baş tevdigere, çend deverên berbiçav hene ku gava ku ew bi hevdemî û berbiçûk pir zêde tê bikar anîn balê hewce dike:

  • Wekî ku di vê gotarê de hatî destnîşan kirin, naha hemî mijarên karker dema ku li tampona bîranîna têketina gihîştinê dinivîsin qeflek digirin. Di hevdemî û berbi bilind de, hûn ê hewce bikin ku dema ku hûn pelê paşîn binivîsin têketinên gihîştinê ji bo her xêza xebatkar li ser lêçûna radestkirina ji rêzê berhev bikin. Alternatîf, hûn dikarin ji bo her tîra karkerek têketinek gihîştina cihê biafirînin.
  • Her çend statîstîk pir xweşbîn in, di hevdemî û berbi pir zêde de dê îhtîmala ku li ser statîstîkên kesane nakokiyên atomî hebe. Çareseriya vê pirsgirêkê jimarvanan e ku li ser têleka karker bi vesazkirina periyodîk a jimarvanên navendî re ye. Ev dê di postek paşîn de were nîqaş kirin.
  • Mîmariya heyî dê baş nexebite heke Envoy di senaryoyek ku tê de pir hindik girêdan hene ku hewceyê çavkaniyên girîng ên pêvajoyê hewce dike were bicîh kirin. Tu garantî tune ku girêdan dê di nav xêzên karkeran de bi rengek wekhev bêne belav kirin. Ev dikare bi pêkanîna hevsengiya pêwendiya karkeran ve were çareser kirin, ku dê rê bide pevguhertina girêdanan di navbera tîrêjên karker de.

Xelasî

Modela danûstendinê ya Envoy ji bo hêsankirina bernamekirinê û paralelîzma girseyî li ser hesabê bîranîn û girêdanên potansiyel betal peyda dike heke rast neyê mîheng kirin. Ev model dihêle ku ew di hejmartin û rêwerziya pir zêde de pir baş bixebite.
Wekî ku min bi kurtî li ser Twitter-ê behs kir, sêwirandin dikare li ser stûnek tevna tevna moda bikarhêner a wekî DPDK (Kiteya Pêşveçûna Balafira Daneyê) jî bixebite, ku dikare bibe sedem ku serverên kevneşopî bi hilanîna bi tevahî L7-ê bi mîlyonan daxwazan di çirkeyê de bi rê ve bibin. Dê pir balkêş be ku meriv bibîne ku di çend salên pêş de çi çêdibe.
Raveyek bilez a paşîn: Gelek caran ji min hat pirsîn ka çima me C ++ ji bo Envoy hilbijart. Sedem dimîne ku ew hîn jî tenê zimanê pola pîşesazî ye ku bi berfirehî tê bikar anîn ku mîmariya ku di vê postê de hatî destnîşan kirin dikare were çêkirin. C++ bê guman ji bo hemî an jî gelek projeyan ne maqûl e, lê ji bo hin rewşên karanîna ew hîn jî amûrek yekane ye ku kar bi dest bixe.

Girêdanên kodê

Girêdanên pelên bi navgîn û pêkanînên sernavê yên ku di vê postê de têne nîqaş kirin:

Source: www.habr.com

Add a comment