[Unuhi] Ke kumu hoʻohālike elele

Unuhi o ka ʻatikala: ʻO ke ʻano hoʻohālike o ka ʻelele - https://blog.envoyproxy.io/envoy-threading-model-a8d44b922310

Ua ʻike wau he mea hoihoi loa kēia ʻatikala, a ʻoiai ua hoʻohana pinepine ʻia ʻo Envoy ma ke ʻano he ʻāpana o ka "istio" a i ʻole ma ke ʻano he "ingress controller" o nā kubernetes, ʻaʻole like ka nui o ka poʻe me ia e like me ka laʻana, me ka maʻamau. Nā hoʻonohonoho Nginx a i ʻole Haproxy. Eia naʻe, inā haki kekahi mea, maikaʻi e hoʻomaopopo i ka hana ʻana mai loko mai. Ua hoʻāʻo wau e unuhi i ka nui o nā kikokikona i ka Lūkini e like me ka hiki, me nā huaʻōlelo kūikawā; no ka poʻe ʻeha ke nānā aku i kēia, waiho wau i nā kumu mua i loko o nā pale. Welina mai i ka popoki.

ʻO nā palapala ʻenehana haʻahaʻa haʻahaʻa no ka Envoy codebase i kēia manawa he kakaʻikahi. No ka hoʻoponopono ʻana i kēia, hoʻolālā wau e hana i kahi ʻano o nā pou blog e pili ana i nā subsystems like ʻole o Envoy. No ka mea ʻo kēia ka ʻatikala mua, e ʻoluʻolu e haʻi mai iaʻu i kou manaʻo a me kāu mea e hoihoi ai i nā ʻatikala e hiki mai ana.

ʻO kekahi o nā nīnau loea maʻamau i loaʻa iaʻu e pili ana iā Envoy e noi ana i kahi wehewehe haʻahaʻa haʻahaʻa o ka hiʻohiʻona threading e hoʻohana ai. Ma kēia pou, e wehewehe au i ke ʻano o ka palapala ʻāina ʻo Envoy i nā pili i nā kaula, a me ka ʻōnaehana Thread Local Storage e hoʻohana ai i loko e hana i nā code ʻoi aku ka like a me ka hana kiʻekiʻe.

Hōʻike manaʻo threading

[Unuhi] Ke kumu hoʻohālike elele

Hoʻohana ʻo Envoy i ʻekolu ʻano kahawai:

  • Nui: Mālama kēia pae i ka hoʻomaka ʻana a me ka hoʻopau ʻana, nā hana a pau o ka XDS (xDiscovery Service) API, me ka DNS, ka nānā ʻana i ke olakino, ka hui maʻamau a me ka hoʻokele runtime, ka hoʻoponopono ʻana i nā helu, ka hoʻoponopono ʻana a me ka hoʻokele kaʻina hana maʻamau - nā hōʻailona Linux. Hot restart, etc. ʻAʻole i hoʻopaʻa ʻia ka hana ma kēia pae. Ma keʻano laulā, hoʻonohonoho ka pae nui i nā kaʻina hana koʻikoʻi āpau i koi ʻole i ka nui o ka CPU e holo. ʻO kēia ka mea e hiki ai ke kākau ʻia ka hapa nui o nā code mana e like me ke kaula hoʻokahi.
  • Mea hana: ʻO ka mea maʻamau, hana ʻo Envoy i kahi kaula hana no kēlā me kēia kaula lako i loko o ka ʻōnaehana, hiki ke hoʻomalu ʻia me ka hoʻohana ʻana i ke koho --concurrency. Ke holo nei kēlā me kēia pae hana i kahi loop hanana "non-blocking", nona ke kuleana no ka hoʻolohe ʻana i kēlā me kēia mea hoʻolohe; i ka manawa e kākau ai (Iulai 29, 2017) ʻaʻohe sharding o ka mea hoʻolohe, e ʻae ana i nā pilina hou, e hoʻomaka ana i kahi hoʻopaʻa kānana no ka pilina, a me ka hana ʻana i nā hana hoʻokomo/puka (IO) i ka wā e ola ana ka pilina. Eia hou, hiki i kēia ke kākau i ka hapa nui o nā code mālama pili e like me ke kaula hoʻokahi.
  • Mea hoʻoheheʻe faila: ʻO kēlā me kēia faila i kākau ʻia e Envoy, ʻoi aku ka nui o ka loaʻa ʻana o nā lāʻau, aia i kēia manawa kahi kaula pale kūʻokoʻa. ʻO kēia ma muli o ke kākau ʻana i nā faila i hūnā ʻia e ka ʻōnaehana faila ʻoiai ke hoʻohana nei O_NONBLOCK hiki i kekahi manawa ke ālai ʻia (sigh). I ka wā e pono ai nā lola limahana e kākau i kahi faila, ua hoʻoneʻe ʻia ka ʻikepili i kahi hoʻomanaʻo i hoʻomanaʻo ʻia kahi e hoʻoheheʻe ʻia ai ma ke kaula. paʻa waihona. ʻO kēia kahi o nā code kahi e hiki ai i nā kaula hana a pau ke pale i ka laka like ʻoiai e hoʻāʻo ana e hoʻopiha i kahi pahu hoʻomanaʻo.

Hoʻopili pili

E like me ka mea i kūkākūkā ʻia ma luna nei, e hoʻolohe nā kaula hana a pau i nā mea hoʻolohe a pau me ka ʻole o ka sharding. No laila, hoʻohana ʻia ka kernel e hoʻouna maikaʻi i nā kumu i ʻae ʻia i nā kaula hana. Maikaʻi loa nā kernels hou i kēia, hoʻohana lākou i nā hiʻohiʻona e like me ka input/output (IO) priority boosting e hoʻāʻo e hoʻopiha i kahi kaula me ka hana ma mua o ka hoʻomaka ʻana i ka hoʻohana ʻana i nā kaula ʻē aʻe e hoʻolohe pū ana ma ke kumu hoʻokahi, a ʻaʻole hoʻi e hoʻohana i ka round robin. laka (Spinlock) e hana i kēlā me kēia noi.
Ke ʻae ʻia kahi pilina ma kahi milo limahana, ʻaʻole ia e haʻalele i kēlā milo. Hoʻopili ʻia nā hana hou aʻe o ka pilina ma ka pae hana, me nā ʻano hana hoʻouna.

He mau hopena koʻikoʻi kēia:

  • Hāʻawi ʻia nā kolamu pili āpau ma Envoy i kahi pae hana. No laila, ʻoiai ʻo HTTP/2 pili wale nō e hoʻohui i hoʻokahi pili i kēlā me kēia host upstream i ka manawa, inā ʻehā mau kaula hana, ʻehā mau pilina HTTP/2 no kēlā me kēia host upstream ma kahi kūlana paʻa.
  • ʻO ke kumu e hana ai ʻo Envoy i kēia ʻano, ʻo ka mālama ʻana i nā mea āpau ma ke kaula hana hoʻokahi, aneane hiki ke kākau ʻia nā code āpau me ka ʻole o ka pale ʻana a me he mea lā he kaula hoʻokahi. He mea maʻalahi kēia hoʻolālā e kākau i nā code he nui a me nā unahi maikaʻi loa i kahi helu palena ʻole o nā kaula hana.
  • Eia nō naʻe, ʻo kekahi o nā mea nui e lawe ʻia mai kahi waihona hoʻomanaʻo a me ke kūlana kūpono o ka pilina, he mea nui loa ia e hoʻonohonoho i ka --concurrency. ʻO ka loaʻa ʻana o nā kaula hana ʻoi aku ma mua o ka mea e pono ai e hoʻopau i ka hoʻomanaʻo, e hana i nā pilina hana ʻole, a e hōʻemi i ka helu o ka hui ʻana. Ma Lyft, holo kā mākou mau pahu kaʻa ʻelele me ka haʻahaʻa haʻahaʻa loa i kūpono ka hana i nā lawelawe a lākou e noho ai. Hoʻokele mākou iā Envoy ma ke ʻano he koho hope wale nō ma ka concurrency kiʻekiʻe.

He aha ke ʻano o ka pāpā ʻole?

Ua hoʻohana pinepine ʻia ka huaʻōlelo "non-blocking" i ka wā e kūkākūkā ai pehea e hana ai nā kaula nui a me nā mea hana. Ua kākau ʻia nā code āpau ma ka manaʻo ʻaʻohe mea i pāpā ʻia. Eia naʻe, ʻaʻole ʻoiaʻiʻo loa kēia (he aha ka ʻoiaʻiʻo ʻole?).

Hoʻohana ʻo Envoy i kekahi mau laka kaʻina hana lōʻihi:

  • E like me ka mea i kūkākūkā ʻia, i ka wā e kākau ai i nā lāʻau komo, loaʻa i nā kaula hana a pau ka laka hoʻokahi ma mua o ka hoʻopiha ʻia ʻana o ka pahu pahu hoʻomanaʻo. He haʻahaʻa loa ka manawa paʻa paʻa, akā hiki ke hoʻopaʻapaʻa ʻia ka laka ma ka concurrency kiʻekiʻe a me ka throughput kiʻekiʻe.
  • Hoʻohana ʻo Envoy i kahi ʻōnaehana paʻakikī no ka mālama ʻana i nā ʻikepili pili i ka pae. ʻO kēia ke kumuhana o kahi pou kaʻawale. Eia nō naʻe, e haʻi pōkole wau ma ke ʻano he ʻāpana o ka hoʻoponopono ʻana i nā helu helu ma ka ʻāina, i kekahi manawa pono ke kiʻi i kahi laka ma ke kikowaena "stats store". ʻAʻole pono e koi ʻia kēia laka.
  • Pono ka loina nui e hoʻohui i kēlā me kēia manawa me nā loina hana a pau. Hana ʻia kēia ma ka "paʻi ʻana" mai ke kaula nui a i nā loina limahana, a i kekahi manawa mai nā loina limahana e hoʻi i ka loina nui. Pono ka hoʻouna ʻana i kahi laka i hiki ke hoʻopaʻa ʻia ka memo i paʻi ʻia no ka hoʻouna ʻana ma hope. ʻAʻole pono e hoʻopaʻapaʻa nui ʻia kēia mau laka, akā hiki ke hoʻopaʻa ʻia.
  • Ke kākau ʻo Envoy i kahi log i ke kahawai hewa ʻōnaehana (hewa maʻamau), loaʻa iā ia kahi laka ma ke kaʻina holoʻokoʻa. Ma keʻano laulā, ua manaʻo ʻia ka hoʻopaʻa inoa kūloko o Envoy i mea weliweli mai kahi hiʻohiʻona hana, no laila ʻaʻole i manaʻo nui ʻia i ka hoʻomaikaʻi ʻana.
  • Aia kekahi mau laka ʻokoʻa ʻē aʻe, akā ʻaʻohe o lākou he koʻikoʻi hana a ʻaʻole pono e hoʻokūkū ʻia.

Uila mālama kūloko

Ma muli o keʻano o ka hoʻokaʻawaleʻana o Envoy i nā kuleana o ke kaula nui mai nā kuleana o ke kaula hana, aia kahi koi e hiki ke hana i ka hana paʻakikī ma ke kaula nui a laila hāʻawiʻia i kēlā me kēia kaula hana ma keʻano likeʻole. Hōʻike kēia ʻāpana i ka Envoy Thread Local Storage (TLS) ma kahi kiʻekiʻe. Ma ka ʻāpana aʻe e wehewehe wau i ka hoʻohana ʻana i ka mālama ʻana i kahi pūʻulu.
[Unuhi] Ke kumu hoʻohālike elele

E like me ka mea i hōʻike mua ʻia, ʻo ke kaula nui e hoʻokele i nā hana āpau a me ka hoʻokele mokulele i ke kaʻina Envoy. Ua ʻoi aku ka nui o ka mokulele hoʻokele ma ʻaneʻi, akā ke nānā ʻoe iā ia i loko o ke kaʻina Envoy ponoʻī a hoʻohālikelike ʻia me ka hoʻouna ʻana i hana ʻia e nā kaula hana, kūpono ia. ʻO ke kānāwai maʻamau ka hana ʻana o ke kaʻina hana nui, a laila pono ia e hoʻonui i kēlā me kēia kaula hana e like me ka hopena o ia hana. i kēia hihia, ʻaʻole pono ke kaula hana e loaʻa i kahi laka ma kēlā me kēia komo.

Ke hana nei ka ʻōnaehana TLS (Thread local storage) o Envoy penei:

  • Hiki i ke code e holo ana ma ke kaula nui ke hoʻokaʻawale i kahi slot TLS no ke kaʻina holoʻokoʻa. ʻOiai ua hoʻokaʻawale ʻia kēia, ma ka hoʻomaʻamaʻa ʻana he kuhikuhi ia i loko o kahi vector, e hāʻawi ana iā O(1).
  • Hiki i ke kaula nui ke hoʻokomo i ka ʻikepili kū ʻole i loko o kona slot. Ke hana ʻia kēia, paʻi ʻia ka ʻikepili i kēlā me kēia pae hana ma ke ʻano he hanana hanana hanana maʻamau.
  • Hiki i nā loina limahana ke heluhelu mai ko lākou TLS slot a kiʻi i nā ʻikepili pili-lohelohe i loaʻa ma laila.

ʻOiai he paradigm maʻalahi a ikaika loa ia, ua like loa ia me ka manaʻo o RCU (Read-Copy-Update) blocking. ʻO ka mea nui, ʻaʻole ʻike nā kaula limahana i nā loli ʻikepili i nā slot TLS i ka wā e holo ana ka hana. Hoʻololi wale ʻia i ka wā hoʻomaha ma waena o nā hanana hana.

Hoʻohana ʻo Envoy i kēia ma nā ʻano ʻelua:

  • Ma ka mālama ʻana i nā ʻikepili like ʻole ma kēlā me kēia pae hana, hiki ke kiʻi ʻia ka ʻikepili me ka ʻole o ka pale ʻana.
  • Ma ka mālama ʻana i kahi kuhikuhi i kaʻana like i ka ʻikepili honua ma ke ʻano heluhelu-wale nō ma kēlā me kēia pae hana. No laila, loaʻa i kēlā me kēia pae hana ka helu kuhikuhi ʻikepili ʻaʻole hiki ke hoʻemi ʻia i ka wā e holo ana ka hana. Ke hoʻomaha wale nā ​​limahana a pau a hoʻouka i ka ʻikepili kaʻana like hou e luku ʻia ka ʻikepili kahiko. Ua like kēia me RCU.

ʻO ka hoʻopili ʻana o ka hui pūʻulu

Ma kēia ʻāpana, e wehewehe au i ka hoʻohana ʻana o TLS (Thread local storage) no ka mālama ʻana i kahi hui. Loaʻa ka hoʻokele Cluster i ka xDS API a/a i ʻole ka hana DNS, a me ka nānā olakino.
[Unuhi] Ke kumu hoʻohālike elele

Aia nā ʻāpana a me nā ʻanuʻu i ka hoʻokele Cluster flow:

  1. He ʻāpana ka Cluster Manager i loko o ka ʻElele nāna e hoʻokele i nā pūʻulu a pau i ʻike ʻia i luna, ka Cluster Discovery Service (CDS) API, ka Secret Discovery Service (SDS) a me Endpoint Discovery Service (EDS) APIs, DNS, a me nā mākaʻikaʻi o waho. Na ia ke kuleana no ka hoʻokumu ʻana i kahi ʻike "kūlike like" o kēlā me kēia puʻupuʻu upstream, e pili ana i nā pūʻali i ʻike ʻia a me ke kūlana olakino.
  2. Hana ka mea nānā ola i kahi nānā olakino ikaika a hōʻike i nā loli kūlana olakino i ka luna hui.
  3. Hana ʻia ʻo CDS (Cluster Discovery Service) / SDS (Secret Discovery Service) / EDS (Endpoint Discovery Service) / DNS no ka hoʻoholo ʻana i ka lālā hui. Hoʻihoʻi ʻia ka hoʻololi mokuʻāina i ka luna hui.
  4. Ke hoʻokō mau nei kēlā me kēia pae hana i kahi loop hanana.
  5. Ke hoʻoholo ka luna puʻupuʻu ua loli ka mokuʻāina no kahi pūʻulu, hana ia i kahi kiʻi heluhelu-wale wale nō o ka mokuʻāina o ka puʻupuʻu a hoʻouna i kēlā me kēia kaula hana.
  6. I loko o ka manawa mālie aʻe, e hōʻano hou ka pae hana i ke kiʻi paʻi ma ka slot TLS i hāʻawi ʻia.
  7. I loko o kahi hanana I/O i manaʻo ʻia e hoʻoholo i ka mea hoʻokipa e hoʻouka i ke koena, e noi ka mea kaulike i kahi slot TLS (Thread local storage) e loaʻa ai ka ʻike e pili ana i ka mea hoʻokipa. ʻAʻole pono kēia i nā laka. E hoʻomaopopo hoʻi e hiki nō iā TLS ke hoʻomaka i nā hanana hou i hiki i nā mea kaulike hoʻouka a me nā mea ʻē aʻe ke helu hou i nā huna huna, nā hale ʻikepili, etc. ʻOi aku kēia ma waho o ke kiko o kēia pou, akā hoʻohana ʻia ma nā wahi like ʻole o ke code.

Ke hoʻohana nei i ke kaʻina hana i luna, hiki i ka ʻelele ke hana i kēlā me kēia noi me ka ʻole o ka pale ʻana (koe wale nō ka mea i wehewehe ʻia ma mua). Ma waho aʻe o ka paʻakikī o ke code TLS ponoʻī, ʻaʻole pono ka hapa nui o ke code e hoʻomaopopo i ke ʻano o ka hana ʻana o ka multithreading a hiki ke kākau ʻia i hoʻokahi kaula. ʻO kēia ka mea e maʻalahi ai ka kākau ʻana i ka hapa nui o ke code me ka hana ʻoi aku ka maikaʻi.

Nā ʻōnaehana ʻē aʻe e hoʻohana ana i ka TLS

Hoʻohana nui ʻia ʻo TLS (Thread local storage) a me RCU (Read Copy Update) ma Envoy.

Nā hiʻohiʻona o ka hoʻohana ʻana:

  • Mechanism no ka hoʻololi ʻana i ka hana i ka wā e hoʻokō ai: ʻO ka papa inoa o kēia manawa o nā hana i hiki ke helu ʻia ma ka pae nui. Hāʻawi ʻia kēlā me kēia pae hana i kahi kiʻi heluhelu wale nō me ka hoʻohana ʻana i nā semantics RCU.
  • Ke pani nei i nā papa ala: No nā papa alahele i hāʻawi ʻia e RDS (Route Discovery Service), ua hana ʻia nā papa kuhikuhi ma ka pae nui. E hāʻawi ʻia ka paʻi heluhelu-wale i kēlā me kēia pae hana me ka hoʻohana ʻana i nā semantics RCU (Read Copy Update). Hoʻololi kēia i ka hoʻololi ʻana i nā papa kuhikuhi ala atomically.
  • Ke kāʻei ʻana i ke poʻomanaʻo HTTP: E like me ka mea i ʻike ʻia, ʻo ka helu ʻana i ke poʻo HTTP no kēlā me kēia noi (ʻoiai e holo ana ~ 25K+ RPS no kēlā me kēia kumu) he mea kūʻai nui. Hoʻopili ka ʻelele i ke poʻo i kēlā me kēia hapalua kekona a hāʻawi iā ia i kēlā me kēia limahana ma o TLS a me RCU.

Aia kekahi mau hihia ʻē aʻe, akā ʻo nā hiʻohiʻona mua e hāʻawi i kahi ʻike maikaʻi i ka mea e hoʻohana ʻia ai ka TLS.

ʻIke ʻia nā lua hana

ʻOiai ke hana maikaʻi nei ʻo Envoy i ka holoʻokoʻa, aia kekahi mau wahi kaulana e pono ai ka nānā ʻana ke hoʻohana ʻia me ka concurrency kiʻekiʻe a me ka throughput:

  • E like me ka wehewehe ʻana ma kēia ʻatikala, loaʻa i nā kaula hana a pau i kahi laka ke kākau ʻana i ka pahu hoʻomanaʻo log access. Ma ka hoʻohālikelike kiʻekiʻe a me ka loaʻa kiʻekiʻe, pono ʻoe e hoʻopaʻa i nā moʻolelo no kēlā me kēia pae hana ma ka uku o ka lawe ʻana i waho o ke kauoha i ka wā e kākau ai i ka faila hope. ʻO kahi ʻē aʻe, hiki iā ʻoe ke hana i kahi moʻolelo komo ʻokoʻa no kēlā me kēia pae hana.
  • ʻOiai ʻoi aku ka maikaʻi o nā helu helu, ma ka concurrency kiʻekiʻe a me ka throughput e loaʻa paha ka paio atomika ma nā helu helu pākahi. ʻO ka hoʻonā ʻana i kēia pilikia, ʻo ia nā helu helu no kēlā me kēia pae hana me ka hoʻoponopono ʻana i nā helu kikowaena. E kūkākūkā ʻia kēia ma kekahi pou aʻe.
  • ʻAʻole e hana maikaʻi ka hale hoʻolālā o kēia manawa inā hoʻokomo ʻia ʻo Envoy i kahi hiʻohiʻona kahi liʻiliʻi loa nā pilina e koi ana i nā kumuwaiwai hoʻoponopono koʻikoʻi. ʻAʻohe mea e hōʻoiaʻiʻo e puʻunaue like ʻia nā pilina ma waena o nā kaula hana. Hiki ke hoʻoholo ʻia kēia ma ka hoʻokō ʻana i ke kaulike pili pili limahana, e ʻae ai i ka hoʻololi ʻana i nā pilina ma waena o nā kaula hana.

Ka hopena

Hoʻolālā ʻia ke kumu hoʻohālike threading a Envoy e hāʻawi i ka maʻalahi o ka hoʻonohonoho ʻana a me ka parallelism nui ma ka lilo o ka hoʻomanaʻo ʻana a me nā pilina inā ʻaʻole i hoʻonohonoho pono ʻia. Hiki i kēia kŘkohu ke hana maikaʻi loa i nā helu pae kiʻekiʻe loa a me ka puka.
E like me kaʻu i haʻi pōkole ai ma Twitter, hiki i ka hoʻolālā ke holo ma luna o kahi waihona pūnaewele hoʻohana piha e like me DPDK (Data Plane Development Kit), hiki ke hopena i nā kikowaena maʻamau e lawelawe ana i nā miliona o nā noi i kēlā me kēia kekona me ka hana L7 piha. He mea hoihoi loa ia e ʻike i nā mea e kūkulu ʻia i nā makahiki e hiki mai ana.
ʻO kahi ʻōlelo wikiwiki hope loa: Ua nīnau pinepine ʻia iaʻu no ke aha mākou i koho ai iā C++ no Envoy. Ke waiho nei ke kumu, ʻo ia wale nō ka ʻōlelo ʻenehana i hoʻohana nui ʻia i hiki ke kūkulu ʻia ka hale hana i wehewehe ʻia ma kēia pou. ʻAʻole kūpono ʻo C ++ i nā papahana āpau a i ʻole nā ​​​​mea he nui, akā no kekahi mau hihia hoʻohana ʻo ia wale nō ka mea hana e hoʻokō ai i ka hana.

Nā loulou i ke code

Nā loulou i nā faila me nā loulou a me nā hoʻokō poʻomanaʻo i kūkākūkā ʻia ma kēia pou:

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka