[Tarjamahan] Modél threading Utusan

Tarjamahan artikel: Modél threading utusan - https://blog.envoyproxy.io/envoy-threading-model-a8d44b922310

Kuring manggihan artikel ieu rada metot, sarta saprak Utusan paling mindeng dipaké salaku bagian tina "istio" atawa ngan saukur salaku "ingress controller" tina kubernetes, paling jalma teu boga interaksi langsung sarua jeung eta salaku, contona, kalawan has. Pamasangan Nginx atanapi Haproxy. Nanging, upami aya anu ngarecah, langkung saé ngartos kumaha jalanna ti jero. Kuring nyobian narjamahkeun saloba-lobana téks kana basa Rusia sabisa-bisa, kaasup kecap-kecap khusus; pikeun anu ngarasa nyeri ningali ieu, kuring ngantepkeun aslina dina kurung. Wilujeng sumping di ucing.

Dokuméntasi téknis tingkat rendah pikeun pangkalan kode Utusan ayeuna rada jarang. Pikeun ngalereskeun ieu, kuring ngarencanakeun pikeun ngalakukeun sababaraha tulisan blog ngeunaan rupa-rupa subsistem Utusan. Kusabab ieu mangrupikeun tulisan anu munggaran, punten wartosan kuring naon anu anjeun pikirkeun sareng naon anu anjeun pikahoyong dina tulisan anu bakal datang.

Salah sahiji patarosan téknis anu paling umum anu kuring tampi ngeunaan Envoy nyaéta naroskeun katerangan tingkat rendah ngeunaan modél threading anu dianggo. Dina tulisan ieu, kuring bakal ngajelaskeun kumaha Utusan peta sambungan kana benang, ogé sistem Panyimpenan Lokal Thread anu dianggo sacara internal pikeun ngajantenkeun kode langkung paralel sareng berkinerja tinggi.

Tinjauan threading

[Tarjamahan] Modél threading Utusan

Utusan nganggo tilu jinis aliran:

  • Utama: Thread ieu ngadalikeun prosés ngamimitian jeung terminasi, sadaya ngolah XDS (xDiscovery Service) API, kaasup DNS, mariksa kaséhatan, klaster umum jeung manajemén runtime, reset statistik, administrasi jeung manajemén prosés umum - sinyal Linux Ubuntu balikan deui panas, jsb. kajadian dina thread ieu asynchronous jeung "non-blocking". Sacara umum, thread utama koordinat sadaya prosés fungsionalitas kritis nu teu merlukeun jumlah badag CPU pikeun ngajalankeun. Hal ieu ngamungkinkeun paling kode kontrol bisa ditulis saolah-olah éta single threaded.
  • Pagawe: Sacara standar, Utusan nyiptakeun benang padamel pikeun unggal benang hardware dina sistem, ieu tiasa dikontrol nganggo pilihan --concurrency. Unggal thread pagawe ngajalankeun loop acara "non-blocking", nu tanggung jawab ngadangukeun unggal pangdéngé; dina waktu nulis (Juli 29, 2017) euweuh sharding pangdéngé, narima sambungan anyar, instantiating tumpukan filter pikeun sambungan, jeung ngolah sagala input / output (IO) operasi salila hirupna sambungan nu. Deui, ieu ngamungkinkeun paling kode penanganan sambungan bisa ditulis saolah-olah éta single threaded.
  • File flusher: Unggal file anu ditulis Utusan, utamana log aksés, ayeuna gaduh thread blocking bebas. Ieu alatan kanyataan yén nulis ka file sindangan ku sistem file sanajan ngagunakeun O_NONBLOCK sakapeung bisa dihalangan (ngahuleng). Nalika benang pagawe kedah nyerat kana file, datana leres-leres dipindahkeun ka panyangga dina mémori dimana antukna dialirkeun kana benang. file siram. Ieu mangrupikeun salah sahiji daérah kode dimana sacara téknis sadaya benang padamel tiasa meungpeuk konci anu sami nalika nyobian ngeusian panyangga mémori.

Nanganan sambungan

Sakumaha anu dibahas sakedap di luhur, sadaya benang padamel ngadangukeun sadaya pamirsa tanpa aya sharding. Ku kituna, kernel dipaké pikeun gracefully ngirim sockets ditarima ka threads worker. Kernel modern umumna saé pisan dina ieu, aranjeunna ngagunakeun fitur sapertos naekeun prioritas input / output (IO) pikeun nyobian ngeusian benang ku padamelan sateuacan aranjeunna mimiti nganggo benang sanés anu ogé ngadangukeun dina stop kontak anu sami, sareng ogé henteu nganggo round robin. ngonci (Spinlock) pikeun ngolah unggal pamundut.
Sakali sambungan katampa dina thread worker, éta pernah ninggalkeun thread éta. Sadaya pamrosésan sambungan salajengna diurus sacara lengkep dina benang pagawé, kalebet paripolah anu diteruskeun.

Ieu ngagaduhan sababaraha akibat anu penting:

  • Kabéh pools sambungan di Utusan ditugaskeun ka thread worker. Ku kituna, sanajan HTTP / 2 pools sambungan ngan nyieun hiji sambungan ka unggal host hulu dina hiji waktu, lamun aya opat threads worker, bakal aya opat sambungan HTTP / 2 per host hulu dina kaayaan ajeg.
  • Alesanna Utusan dianggo ku cara ieu nyaéta ku cara ngajaga sadayana dina benang padamel tunggal, ampir sadaya kode tiasa ditulis tanpa ngahalangan sareng saolah-olah aya benang tunggal. Desain ieu ngagampangkeun nyerat seueur kode sareng skala anu luar biasa pikeun jumlah benang padamel anu ampir henteu terbatas.
  • Tapi, salah sahiji takeaways utama nyaéta yén tina kolam renang mémori sareng sudut pandang efisiensi sambungan, saleresna penting pisan pikeun ngonpigurasikeun --concurrency. Ngabogaan threads worker leuwih ti diperlukeun bakal runtah memori, nyieun leuwih sambungan dianggurkeun, sarta ngurangan laju pooling sambungan. Di Lyft, wadah sidecar utusan urang ngajalankeun kalawan concurrency pisan low sahingga kinerja kasarna cocog jasa maranéhna diuk gigireun. Urang ngajalankeun Utusan salaku proksi ujung ngan dina concurrency maksimum.

Naon hartosna non-blocking?

Istilah "non-blocking" parantos dianggo sababaraha kali dugi ka ayeuna nalika ngabahas kumaha utas utama sareng padamel. Sadaya kode ditulis dina anggapan yén teu aya anu diblokir. Sanajan kitu, ieu teu sagemblengna bener (naon teu sagemblengna bener?).

Utusan nganggo sababaraha konci prosés panjang:

  • Sapertos anu dibahas, nalika nyerat log aksés, sadaya benang padamel ngagaduhan konci anu sami sateuacan panyangga log dina mémori dieusi. Waktos nahan konci kedah sakedik pisan, tapi kamungkinan konci tiasa dilombakeun dina konkurensi anu luhur sareng throughput anu luhur.
  • Utusan ngagunakeun sistem anu kompleks pisan pikeun nanganan statistik anu lokal pikeun benang. Ieu bakal topik pos misah. Najan kitu, kuring sakeudeung bakal disebutkeun yen salaku bagian tina ngolah statistik thread lokal, kadang perlu acquire konci dina sentral "toko stats". Ngonci ieu kedah pernah diperlukeun.
  • Utas utama périodik kedah koordinat sareng sadaya benang padamel. Hal ieu dilakukeun ku "medarkeun" tina utas utama ka utas padamel, sareng sakapeung tina utas pagawé deui kana utas utama. Ngirim butuh konci supados pesen anu diterbitkeun tiasa diantri pikeun pangiriman engké. Konci ieu teu kedah diperdebatkeun sacara serius, tapi sacara teknis masih tiasa diblokir.
  • Nalika Utusan nyerat log kana aliran kasalahan sistem (kasalahan standar), éta kéngingkeun konci dina sadaya prosés. Sacara umum, logging lokal Utusan dianggap pikasieuneun tina sudut pandang kinerja, janten teu acan seueur perhatian anu dipasihkeun pikeun ningkatkeunana.
  • Aya sababaraha konci acak anu sanés, tapi teu aya anu kritis kinerja sareng henteu kedah ditantang.

Utas gudang lokal

Kusabab cara Utusan misahkeun tanggung jawab benang utama tina tanggung jawab benang padamel, aya sarat yén pamrosésan kompleks tiasa dilakukeun dina utas utama teras disayogikeun ka unggal benang padamel dina cara anu sakaligus. Bagian ieu ngajelaskeun Envoy Thread Local Storage (TLS) dina tingkat anu luhur. Dina bagian salajengna kuring bakal ngajelaskeun kumaha éta dianggo pikeun ngatur klaster.
[Tarjamahan] Modél threading Utusan

Sakumaha anu parantos dijelaskeun, utas utama nanganan ampir sadaya fungsi manajemén sareng kontrol pesawat dina prosés Utusan. Pesawat kontrol anu rada overloaded dieu, tapi mun anjeun nempo eta dina prosés Utusan sorangan tur dibandingkeun jeung diteruskeun yén threads worker ngalakukeun, asup akal. Aturan umum nyaéta yén prosés utas utama ngalakukeun sababaraha padamelan, teras éta kedah ngapdet unggal utas padamel dumasar kana hasil padamelan éta. dina hal ieu, thread worker teu perlu acquire konci dina unggal aksés.

Sistem TLS (Thread local storage) Envoy berpungsi sapertos kieu:

  • Kodeu ngajalankeun dina thread utama bisa allocate slot TLS pikeun sakabéh prosés. Sanajan ieu abstrak, dina praktekna mangrupa indéks kana vektor, nyadiakeun O (1) aksés.
  • Thread utama tiasa install data sawenang kana slot na. Nalika ieu rengse, data diterbitkeun ka unggal thread worker salaku acara loop acara normal.
  • Utas padamel tiasa maca tina slot TLS na sareng nyandak data lokal anu aya di dinya.

Sanaos éta paradigma anu saderhana sareng luar biasa kuat, éta sami sareng konsép blokir RCU (Baca-Salin-Update). Intina, utas padamel henteu pernah ningali parobahan data dina slot TLS nalika padamelan dijalankeun. Parobahan lumangsung ngan salila periode sésana antara acara gawé.

Utusan ngagunakeun ieu dina dua cara:

  • Ku nyimpen data béda dina unggal thread pagawe, data ieu bisa diaksés tanpa blocking nanaon.
  • Ku ngajaga pointer dibagikeun ka data global dina mode baca-hijina dina unggal thread pagawe. Ku kituna, unggal thread worker boga count rujukan data nu teu bisa decremented bari karya keur jalan. Ngan lamun kabeh pagawe tenang jeung unggah data dibagikeun anyar bakal data heubeul ancur. Ieu idéntik jeung RCU.

Kluster update threading

Dina bagian ieu, kuring bakal ngajelaskeun kumaha TLS (Thread gudang lokal) dipaké pikeun ngatur klaster. Manajemén klaster kalebet xDS API sareng / atanapi pamrosésan DNS, ogé pamariksaan kaséhatan.
[Tarjamahan] Modél threading Utusan

Manajemén aliran klaster kalebet komponén sareng léngkah-léngkah ieu:

  1. Manajer Kluster mangrupikeun komponén dina Utusan anu ngatur sadaya hulu klaster anu dipikanyaho, API Cluster Discovery Service (CDS), API Secret Discovery Service (SDS) sareng Endpoint Discovery Service (EDS), DNS, sareng cék éksternal aktip. mariksa kaséhatan. Éta tanggung jawab pikeun nyiptakeun pandangan anu "antukna konsisten" unggal klaster hulu, anu kalebet host anu kapanggih ogé status kaséhatan.
  2. Pamariksaan kaséhatan ngalaksanakeun pamariksaan kaséhatan aktip sareng ngalaporkeun parobahan status kaséhatan ka manajer klaster.
  3. CDS (Cluster Discovery Service) / SDS (Rusiah Discovery Service) / EDS (Endpoint Discovery Service) / DNS dilakukeun pikeun nangtukeun kaanggotaan klaster. Parobahan kaayaan dipulangkeun ka manajer klaster.
  4. Unggal thread worker terus executes hiji loop acara.
  5. Nalika manajer klaster nangtukeun yén kaayaan keur klaster geus robah, nyiptakeun snapshot dibaca-hijina kaayaan klaster sarta ngirimkeun ka unggal thread worker.
  6. Salila periode sepi salajengna, thread pagawe bakal ngamutahirkeun snapshot dina slot TLS dialokasikeun.
  7. Salila acara I / O anu sakuduna nangtukeun host pikeun beban kasaimbangan, beban balancer bakal menta TLS (Thread gudang lokal) slot pikeun ménta inpo ngeunaan host. Ieu teu merlukeun konci. Catet ogé yén TLS ogé tiasa memicu acara update supados pangimbang beban sareng komponén sanésna tiasa ngitung deui cache, struktur data, jsb. Ieu saluareun ruang lingkup pos ieu, tapi dipaké di sagala rupa tempat dina kode.

Nganggo prosedur di luhur, Utusan tiasa ngolah unggal pamundut tanpa ngahalangan (iwal sakumaha anu dijelaskeun sateuacana). Kumisan ti pajeulitna kode TLS sorangan, lolobana kode teu kudu ngarti kumaha multithreading jalan sarta bisa ditulis single-threaded. Hal ieu ngajadikeun lolobana kodeu gampang nulis salian kinerja unggul.

Subsistem séjén anu ngagunakeun TLS

TLS (Thread local storage) sareng RCU (Read Copy Update) seueur dianggo dina Utusan.

Conto ngagunakeun:

  • Mékanisme pikeun ngarobah fungsionalitas nalika palaksanaan: Daptar fungsionalitas anu diaktipkeun ayeuna diitung dina utas utama. Unggal thread pagawe lajeng dibéré snapshot baca-hijina maké semantik RCU.
  • Ngaganti tabel rute: Pikeun tabel ruteu disadiakeun ku RDS (Layanan Papanggihan Rute), tabel jalur dijieun dina thread utama. The snapshot baca-hijina bakal salajengna disadiakeun pikeun tiap thread worker ngagunakeun RCU (Read Copy Update) semantik. Hal ieu ngajadikeun ngarobah tabel rute efisien atom.
  • cache lulugu HTTP: Tétéla, ngitung lulugu HTTP pikeun tiap pamundut (bari ngajalankeun ~ 25K + RPS per inti) cukup mahal. Utusan sentral ngitung header sakitar unggal satengah detik sareng nyayogikeun ka unggal padamel ngalangkungan TLS sareng RCU.

Aya kasus anu sanés, tapi conto-conto sateuacana kedah masihan pamahaman anu hadé ngeunaan naon anu dianggo TLS.

pitfalls kinerja dipikawanoh

Nalika Envoy ngalaksanakeun sacara saé sacara umum, aya sababaraha daérah anu penting anu peryogi perhatian nalika dianggo kalayan konkurensi sareng throughput anu luhur:

  • Sakumaha anu dijelaskeun dina tulisan ieu, ayeuna sadaya benang padamel ngagaduhan konci nalika nyerat kana panyangga mémori log aksés. Dina concurrency tinggi na throughput tinggi, anjeun bakal kudu bets log aksés pikeun tiap thread pagawe di expense pangiriman kaluar-of-order nalika nulis ka file final. Alternatipna, Anjeun bisa nyieun log aksés misah pikeun tiap thread pagawe.
  • Sanaos statistikna dioptimalkeun pisan, dina konkurensi sareng throughput anu luhur pisan, kamungkinan bakal aya pertentangan atom dina statistik individu. Solusi pikeun masalah ieu counters per thread worker kalawan reset periodik of counters sentral. Ieu bakal dibahas dina postingan salajengna.
  • Arsitéktur ayeuna moal tiasa dianggo saé upami Utusan disebarkeun dina skenario dimana aya sakedik pisan sambungan anu peryogi sumber pamrosésan anu penting. Teu aya jaminan yén sambungan bakal disebarkeun merata diantara benang padamel. Ieu bisa direngsekeun ku nerapkeun balancing sambungan worker, nu bakal ngidinan bursa sambungan antara threads worker.

kacindekan

Modél threading Envoy dirancang pikeun nyadiakeun betah programming sarta paralelisme masif kalawan expense memori berpotensi boros sareng sambungan lamun teu ngonpigurasi leres. Modél ieu ngamungkinkeun pikeun ngalakukeun anu saé dina jumlah benang sareng throughput anu luhur pisan.
Salaku sakeudeung kuring disebutkeun dina Twitter, desain ogé bisa dijalankeun dina luhureun tumpukan jejaring mode-pamaké pinuh kayaning DPDK (Data Plane Development Kit), nu bisa ngahasilkeun server konvensional nanganan jutaan requests per detik kalayan pinuh processing L7. Éta bakal pikaresepeun pisan pikeun ningali naon anu bakal diwangun dina sababaraha taun ka hareup.
Hiji komentar rusuh panungtungan: Kuring geus ditanya sababaraha kali naha urang milih C ++ pikeun Utusan. Alesanna tetep yén éta kénéh hiji-hijina basa kelas industri anu seueur dianggo dimana arsitéktur anu dijelaskeun dina tulisan ieu tiasa diwangun. C ++ pasti teu cocog pikeun sakabéh atawa malah loba proyék, tapi pikeun kasus pamakéan tangtu masih hijina alat pikeun meunangkeun pakasaban rengse.

Tumbu ka kode

Tumbu ka file sareng antarmuka sareng palaksanaan lulugu dibahas dina tulisan ieu:

sumber: www.habr.com

Tambahkeun komentar