[Tradiksyon] Envoy threading model

Tradiksyon atik la: Modèl anvwaye anvwaye - https://blog.envoyproxy.io/envoy-threading-model-a8d44b922310

Mwen te jwenn atik sa a byen enteresan, epi piske Envoy pi souvan itilize kòm yon pati nan "istio" oswa tou senpleman kòm "kontwolè antre" nan kubernetes, pifò moun pa gen menm entèraksyon dirèk ak li kòm, pou egzanp, ak tipik. Enstalasyon Nginx oswa Haproxy. Sepandan, si yon bagay kraze, li ta bon pou konprann ki jan li fonksyone soti nan andedan an. Mwen te eseye tradui tèks la nan Ris ke posib, enkli mo espesyal; pou moun ki twouve li douloure gade sa a, mwen kite orijinal yo nan parantèz. Byenveni nan chat.

Dokimantasyon teknik ki ba-nivo pou baz kod Envoy la se kounye a byen ra. Pou remèd sa a, mwen planifye fè yon seri de pòs blog sou divès subsistèm yo nan Envoy. Piske sa a se premye atik la, tanpri fè m 'konnen sa ou panse ak sa ou ta ka enterese nan atik nan lavni.

Youn nan kesyon teknik ki pi komen mwen resevwa sou Envoy se mande yon deskripsyon ba nivo sou modèl threading li itilize a. Nan pòs sa a, mwen pral dekri ki jan Envoy kat koneksyon ak fil, osi byen ke sistèm depo lokal Thread li itilize intern pou fè kòd plis paralèl ak pèfòmans segondè.

Apèsi sou Threading

[Tradiksyon] Envoy threading model

Envoy itilize twa diferan kalite kouran:

  • Prensipal: Fil sa a kontwole pwosesis demaraj ak revokasyon, tout pwosesis XDS (sèvis xDiscovery) API, ki gen ladan DNS, tcheke sante, gwoup jeneral ak jesyon ègzekutabl, estatistik reset, administrasyon ak jesyon pwosesis jeneral - siyal Linux, rekòmanse cho, elatriye. k ap pase nan fil sa a se asynchrone ak "ki pa bloke". An jeneral, fil prensipal la kowòdone tout pwosesis fonksyonalite kritik ki pa mande pou yon gwo kantite CPU pou kouri. Sa a pèmèt pifò kòd kontwòl yo dwe ekri kòm si li te yon sèl threaded.
  • Travayè: Pa default, Envoy kreye yon fil travayè pou chak fil pyès ki nan konpitè nan sistèm nan, sa a ka kontwole lè l sèvi avèk opsyon an --concurrency. Chak fil travayè kouri yon bouk evènman "ki pa bloke", ki responsab pou koute chak moun k ap koute; nan moman ekri a (29 jiyè 2017) pa gen okenn sharding nan koute a, aksepte nouvo koneksyon, enstansye yon pil filtre pou koneksyon an, ak trete tout operasyon D '/Sòti (IO) pandan tout lavi koneksyon an. Ankò, sa a pèmèt pifò kòd manyen koneksyon yo dwe ekri kòm si li te yon sèl threaded.
  • File flusher: Chak dosye ke Envoy ekri, sitou mòso bwa aksè, kounye a gen yon fil bloke endepandan. Sa a se akòz lefèt ke ekri nan dosye kach pa sistèm nan dosye menm lè w ap itilize O_NONBLOCK ka pafwa jwenn bloke (soupi). Lè fil travayè yo bezwen ekri nan yon dosye, done yo aktyèlman deplase nan yon tanpon nan memwa kote li evantyèlman koule nan fil la. dosye kole. Sa a se yon zòn nan kòd kote teknikman tout fil travayè yo ka bloke menm seri a pandan y ap eseye ranpli yon tanpon memwa.

Manyen koneksyon

Jan nou te diskite yon ti tan pi wo a, tout fil travayè yo koute tout moun k ap koute yo san okenn sharding. Kidonk, yo itilize nwayo a pou voye sipò yo aksepte nan fil travayè yo. Nwayo modèn yo jeneralman trè bon nan sa a, yo sèvi ak karakteristik tankou D '/sòti (IO) priyorite ranfòse pou eseye ranpli yon fil ak travay anvan yo kòmanse sèvi ak lòt fil ki tou ap koute sou priz la menm, epi tou pa sèvi ak round robin. bloke (Spinlock) pou trete chak demann.
Yon fwa yo aksepte yon koneksyon sou yon fil travayè, li pa janm kite fil sa a. Tout pwosesis plis nan koneksyon an okipe antyèman nan fil travayè a, ki gen ladan nenpòt konpòtman voye.

Sa a gen plizyè konsekans enpòtan:

  • Tout pisin koneksyon nan Envoy yo asiyen nan yon fil travayè. Se konsa, byenke pisin koneksyon HTTP/2 sèlman fè yon sèl koneksyon ak chak lame en alafwa, si gen kat fil travayè, pral gen kat koneksyon HTTP/2 pou chak lame en nan yon eta stable.
  • Rezon ki fè Envoy travay nan fason sa a se ke lè yo kenbe tout bagay sou yon sèl fil travayè, prèske tout kòd yo ka ekri san yo pa bloke epi kòm si li te yon sèl fil. Konsepsyon sa a fè li fasil pou ekri yon anpil nan kòd ak balans ekstrèmman byen nan yon kantite prèske san limit nan fil travayè.
  • Sepandan, youn nan pwen prensipal yo se ke nan yon pisin memwa ak pwendvi efikasite koneksyon, li se aktyèlman trè enpòtan nan konfigirasyon an. --concurrency. Lè w gen plis fil travayè pase sa nesesè, sa pral gaspiye memwa, kreye plis koneksyon san fè anyen konsa, epi redwi pousantaj koneksyon koneksyon. Nan Lyft, veso sidecar anvwaye nou yo kouri ak konkou trè ba pou ke pèfòmans apeprè matche ak sèvis yo chita bò kote yo. Nou kouri Envoy kòm yon proxy kwen sèlman nan konkou maksimòm.

Ki sa ki pa bloke vle di?

Tèm "ki pa bloke" yo te itilize plizyè fwa jiskaprezan lè w ap diskite sou fason prensipal ak fil travayè yo travay. Tout kòd ekri sou sipozisyon ke pa gen anyen ki janm bloke. Sepandan, sa a pa totalman vre (sa ki pa totalman vre?).

Envoy itilize plizyè kadna pwosesis long:

  • Jan nou te diskite a, lè w ap ekri mòso bwa aksè, tout fil travayè yo jwenn menm seri a anvan yo ranpli tanpon mòso an memwa a. Tan an kenbe fèmen a ta dwe trè ba, men li posib pou kadna a dwe konteste nan konkou segondè ak debi segondè.
  • Envoy itilize yon sistèm trè konplèks pou okipe estatistik ki lokal nan fil la. Sa a pral sijè a nan yon pòs separe. Sepandan, mwen pral yon ti tan mansyone ke kòm yon pati nan pwosesis estatistik fil lokalman, li se pafwa nesesè jwenn yon seri sou yon santral "magazen estatistik". Verrouillage sa a pa ta dwe janm mande.
  • Fil prensipal la detanzantan bezwen kowòdone ak tout fil travayè yo. Sa a se fè pa "pibliye" soti nan fil prensipal la nan fil travayè, epi pafwa soti nan fil travayè tounen nan fil prensipal la. Voye mande pou yon kadna pou mesaj ki te pibliye a ka mete nan keu pou livrezon pita. Kadna sa yo pa ta dwe janm seryezman konteste, men yo ka toujou teknikman bloke.
  • Lè Envoy ekri yon boutèy demi lit nan kouran erè sistèm lan (erè estanda), li jwenn yon seri sou tout pwosesis la. An jeneral, enregistrement lokal Envoy la konsidere kòm terib nan yon pwendvi pèfòmans, se konsa pa te gen anpil atansyon pou amelyore li.
  • Gen kèk lòt kadna o aza, men pa youn nan yo ki kritik pèfòmans epi yo pa ta dwe janm defye.

Fil depo lokal yo

Akoz fason Envoy separe responsablite fil prensipal la ak responsablite fil travayè a, gen yon kondisyon pou yo ka fè pwosesis konplèks sou fil prensipal la epi bay chak fil travayè nan yon fason ki trè konkouran. Seksyon sa a dekri Envoy Thread Local Storage (TLS) nan yon wo nivo. Nan pwochen seksyon an mwen pral dekri kijan li itilize pou jere yon gwoup.
[Tradiksyon] Envoy threading model

Kòm deja dekri, fil prensipal la okipe nòmalman tout fonksyonalite jesyon ak kontwòl avyon nan pwosesis Envoy la. Avyon kontwòl la se yon ti jan twò chaje isit la, men lè ou gade nan li nan pwosesis Envoy tèt li epi konpare li ak anvwaye ke fil travayè yo fè, li fè sans. Règ jeneral la se ke pwosesis fil prensipal la fè kèk travay, ak Lè sa a, li bezwen mete ajou chak fil travayè dapre rezilta travay sa a. nan ka sa a, fil travayè a pa bezwen jwenn yon seri sou chak aksè.

Sistèm TLS (Thread lokal depo) Envoy la ap travay jan sa a:

  • Kòd kouri sou fil prensipal la ka asiyen yon plas TLS pou tout pwosesis la. Malgre ke sa a abstrè, nan pratik li se yon endèks nan yon vektè, bay aksè O(1).
  • Fil prensipal la ka enstale done abitrè nan plas li yo. Lè sa a se fè, done yo pibliye nan chak fil travayè kòm yon evènman nòmal bouk evènman.
  • Fil travayè yo ka li nan plas TLS yo epi rekipere nenpòt done lokal ki disponib la.

Malgre ke li se yon paradigm trè senp ak ekstrèmman pwisan, li trè menm jan ak konsèp nan RCU (Read-Copy-Update) bloke. Esansyèlman, fil travayè yo pa janm wè okenn chanjman done nan plas TLS yo pandan travay ap kouri. Chanjman fèt sèlman pandan peryòd repo ant evènman travay yo.

Envoy itilize sa a nan de fason diferan:

  • Lè w estoke done diferan sou chak fil travayè, yo ka jwenn aksè nan done yo san okenn bloke.
  • Lè w kenbe yon konsèy pataje sou done mondyal nan mòd lekti sèlman sou chak fil travayè. Kidonk, chak fil travayè gen yon konte referans done ki pa ka diminye pandan travay la ap kouri. Se sèlman lè tout travayè yo kalme epi telechaje nouvo done pataje yo pral detwi ansyen done yo. Sa a se ki idantik ak RCU.

Anfile aktyalizasyon gwoup la

Nan seksyon sa a, mwen pral dekri kijan TLS (Thread lokal depo) yo itilize pou jere yon gwoup. Jesyon Cluster gen ladan xDS API ak / oswa pwosesis DNS, osi byen ke tcheke sante.
[Tradiksyon] Envoy threading model

Jesyon koule Cluster gen ladan eleman ak etap sa yo:

  1. Manadjè Cluster la se yon eleman nan Envoy ki jere tout amont gwoup li te ye, API Cluster Discovery Service (CDS), Secret Discovery Service (SDS) ak Endpoint Discovery Service (EDS) APIs, DNS, ak chèk ekstèn aktif. Li responsab pou kreye yon gade "evantyèlman konsistan" nan chak gwoup en, ki gen ladan tout moun ki dekouvri ak eta sante.
  2. Kontwòl sante a fè yon chèk sante aktif epi li rapòte chanjman eta sante yo bay manadjè gwoup la.
  3. CDS (Cluster Discovery Service) / SDS (Secret Discovery Service) / EDS (Endpoint Discovery Service) / DNS yo fèt pou detèmine manm gwoup la. Chanjman eta a retounen bay manadjè gwoup la.
  4. Chak fil travayè kontinyèlman egzekite yon bouk evènman.
  5. Lè manadjè gwoup la detèmine ke eta a pou yon gwoup te chanje, li kreye yon nouvo snapshot pou lekti sèlman nan eta gwoup la epi voye li nan chak fil travayè.
  6. Pandan pwochen peryòd trankil la, fil travayè a pral mete ajou snapshot la nan plas TLS ki afekte a.
  7. Pandan yon evènman I/O ki sipoze detèmine lame a chaje balans, balans chaj la pral mande yon plas TLS (Thread lokal depo) pou jwenn enfòmasyon sou lame a. Sa a pa mande pou kadna. Remake tou ke TLS kapab tou deklanche evènman aktyalizasyon pou balanse chaj ak lòt konpozan ka rekalkile kachèt, estrikti done, elatriye. Sa a pi lwen pase sijè ki abòde lan pòs sa a, men yo itilize nan divès kote nan kòd la.

Sèvi ak pwosedi ki anwo a, Envoy ka trete chak demann san okenn bloke (eksepte jan sa dekri anvan). Akote de konpleksite nan kòd la TLS tèt li, pi fò nan kòd la pa bezwen konprann ki jan multithreading travay epi yo ka ekri yon sèl-threaded. Sa fè pifò kòd la pi fasil pou ekri anplis pèfòmans siperyè.

Lòt sous-sistèm ki sèvi ak TLS

TLS (Depo lokal Thread) ak RCU (Li Mizajou Kopi) yo lajman itilize nan Envoy.

Men kèk egzanp sou itilizasyon:

  • Mekanis pou chanje fonksyonalite pandan ekzekisyon: Lis aktyèl la nan fonksyonalite pèmèt yo kalkile nan fil prensipal la. Lè sa a, chak fil travayè yo bay yon snapshot pou lekti sèlman lè l sèvi avèk semantik RCU.
  • Ranplase tab wout yo: Pou tab wout ki ofri pa RDS (Route Discovery Service), yo kreye tab wout yo sou fil prensipal la. Apre sa, yo pral bay chak fil travayè snapshot pou lekti sèlman lè l sèvi avèk semantik RCU (Read Copy Update). Sa fè chanjman tab wout yo efikas atomikman.
  • Cache tèt HTTP: Kòm li vire soti, kalkile header HTTP pou chak demann (pandan y ap kouri ~ 25K + RPS pou chak nwayo) se byen chè. Envoy santralman kalkile header la apeprè chak mwatye segonn epi li bay chak travayè atravè TLS ak RCU.

Gen lòt ka, men egzanp anvan yo ta dwe bay yon bon konpreyansyon sou kisa TLS yo itilize pou.

Enkonvenyans pèfòmans li te ye

Pandan ke Envoy fè byen an jeneral, gen kèk zòn remakab ki mande atansyon lè yo itilize li ak konkourans trè wo ak debi:

  • Jan sa dekri nan atik sa a, kounye a tout fil travayè yo jwenn yon seri lè w ap ekri nan tanpon memwa nan boutèy demi lit aksè. Nan konkourans segondè ak debi segondè, w ap bezwen pakèt mòso bwa aksè yo pou chak fil travayè nan depans lan nan livrezon soti nan lòd lè w ap ekri nan dosye final la. Altènativman, ou ka kreye yon jounal aksè separe pou chak fil travayè.
  • Malgre ke estatistik yo trè optimize, nan konkou trè wo ak debi pral gen chans pou gen deba atomik sou estatistik endividyèl elèv yo. Solisyon pwoblèm sa a se kontè pou chak fil travayè ak reset peryodik kontwa santral yo. Sa a pral diskite nan yon pòs ki vin apre.
  • Achitekti aktyèl la pa pral travay byen si Envoy deplwaye nan yon senaryo kote gen anpil koneksyon ki mande anpil resous pwosesis. Pa gen okenn garanti ke koneksyon yo pral respire distribye nan mitan fil travayè yo. Sa a ka rezoud lè w aplike balanse koneksyon travayè, ki pral pèmèt echanj koneksyon ant fil travayè yo.

Konklizyon

Modèl threading Envoy la fèt pou bay fasilite nan pwogramasyon ak paralelis masiv nan depans lan nan memwa ak koneksyon ki kapab gaspiye si yo pa configuré kòrèkteman. Modèl sa a pèmèt li fè trè byen nan kantite fil trè wo ak debi.
Kòm mwen te mansyone yon ti tan sou Twitter, konsepsyon an kapab tou kouri sou tèt yon pil rezo itilizatè-mòd konplè tankou DPDK (Data Plane Development Twous), ki ka lakòz sèvè konvansyonèl manyen dè milyon de demann pou chak segonn ak plen pwosesis L7. Li pral trè enteresan yo wè sa ki vin bati nan kèk ane kap vini yo.
Yon dènye kòmantè rapid: mwen te mande anpil fwa poukisa nou te chwazi C++ pou Envoy. Rezon ki fè la rete ke li se toujou sèlman lajman itilize lang endistriyèl klas nan ki achitekti ki dekri nan pòs sa a ka bati. C ++ definitivman pa apwopriye pou tout oswa menm anpil pwojè, men pou sèten ka itilize li toujou zouti a sèlman pou fè travay la.

Lyen nan kòd

Lyen ki mennen nan dosye ki gen entèfas ak enplemantasyon header yo diskite nan pòs sa a:

Sous: www.habr.com

Add nouvo kòmantè