[Translation] Model threading utusan

Terjemahan artikel: Model threading utusan - https://blog.envoyproxy.io/envoy-threading-model-a8d44b922310

Aku nemokake artikel iki cukup menarik, lan wiwit Utusan paling kerep digunakake minangka bagéan saka "istio" utawa mung minangka "ingress controller" saka kubernetes, paling wong ora duwe interaksi langsung padha karo, contone, karo khas. Panginstalan Nginx utawa Haproxy. Nanging, yen ana sing rusak, luwih becik ngerti cara kerjane saka njero. Aku nyoba nerjemahake akeh teks menyang Rusia sabisa, kalebu tembung khusus; kanggo wong-wong sing nglarani kanggo ndeleng iki, aku ninggalake asli ing kurung. Sugeng rawuh ing kucing.

Dokumentasi teknis tingkat rendah kanggo basis kode Utusan saiki cukup jarang. Kanggo ngatasi masalah iki, aku arep nggawe serangkaian postingan blog babagan macem-macem subsistem Utusan. Amarga iki minangka artikel pisanan, muga-muga aku ngerti apa sing sampeyan pikirake lan apa sing sampeyan minati ing artikel sabanjure.

Salah sawijining pitakonan teknis sing paling umum sing daktampa babagan Utusan yaiku njaluk katrangan tingkat rendah babagan model threading sing digunakake. Ing kirim iki, aku bakal njlèntrèhaké carane Utusan peta sambungan menyang Utas, uga sistem Panyimpenan Lokal Utas sing digunakake sacara internal kanggo nggawe kode luwih sejajar lan kinerja dhuwur.

Ringkesan threading

[Translation] Model threading utusan

Utusan nggunakake telung jinis aliran:

  • Utama: Utas iki ngontrol proses wiwitan lan mandap, kabeh pangolahan XDS (Layanan xDiscovery) API, kalebu DNS, mriksa kesehatan, kluster umum lan manajemen runtime, reset statistik, administrasi lan manajemen proses umum - sinyal Linux. restart panas, etc. kedadeyan ing thread iki ora sinkron lan "non-blocking". Umumé, thread utama koordinat kabeh pangolahan fungsi kritis sing ora mbutuhake jumlah gedhe saka CPU kanggo mbukak. Iki ngidini paling kode kontrol bisa ditulis minangka yen padha siji Utas.
  • buruh: Kanthi gawan, Utusan nggawe thread buruh kanggo saben thread hardware ing sistem, iki bisa kontrol nggunakake pilihan --concurrency. Saben thread buruh mbukak loop acara "non-blocking", sing tanggung jawab kanggo ngrungokake saben pamireng; nalika nulis (29 Juli 2017) ora ana sharding pamireng, nampa sambungan anyar, instantiating tumpukan filter kanggo sambungan, lan proses kabeh input / output (IO) operasi sak umur sambungan. Maneh, iki ngidini paling kode nangani sambungan bisa ditulis minangka yen padha siji Utas.
  • File flusher: Saben file sing ditulis Utusan, utamane ngakses log, saiki duwe benang pamblokiran mandiri. Iki amarga kasunyatan sing nulis menyang file cache dening sistem file sanajan nggunakake O_NONBLOCK sok-sok bisa diblokir (nguyuh). Nalika thread pekerja kudu nulis menyang file, data kasebut bener-bener dipindhah menyang buffer ing memori sing pungkasane dibuang liwat benang file flush. Iki minangka salah sawijining area kode sing sacara teknis kabeh benang pekerja bisa mblokir kunci sing padha nalika nyoba ngisi buffer memori.

Penanganan sambungan

Kaya sing wis dibahas ing ndhuwur, kabeh thread buruh ngrungokake kabeh pamireng tanpa sharding. Mangkono, kernel digunakake kanggo ngirim soket sing ditampa kanthi apik menyang benang pekerja. Kernel modern umume apik banget, dheweke nggunakake fitur kaya prioritas input / output (IO) kanggo nyoba ngisi benang kanthi karya sadurunge miwiti nggunakake benang liyane sing uga ngrungokake soket sing padha, lan uga ora nggunakake round robin. ngunci (Spinlock) kanggo proses saben request.
Sawise sambungan ditampa ing benang buruh, ora bakal ninggalake benang kasebut. Kabeh pangolahan luwih saka sambungan ditangani kabeh ing thread buruh, kalebu sembarang prilaku nerusake.

Iki duwe sawetara akibat penting:

  • Kabeh blumbang sambungan ing Utusan diutus kanggo thread buruh. Dadi, sanajan blumbang sambungan HTTP / 2 mung nggawe siji sambungan menyang saben host hulu sekaligus, yen ana papat benang pekerja, bakal ana papat sambungan HTTP / 2 saben host hulu ing kahanan ajeg.
  • Alesane Utusan kerjane kanthi cara iki yaiku kanthi nyimpen kabeh ing benang buruh siji, meh kabeh kode bisa ditulis tanpa diblokir lan kaya-kaya ana benang tunggal. Desain iki nggampangake nulis akeh kode lan timbangan kanthi apik kanggo benang buruh sing meh ora ana watesan.
  • Nanging, salah siji saka takeaways utama yaiku saka blumbang memori lan sudut pandang efisiensi sambungan, iku penting banget kanggo ngatur --concurrency. Nduwe benang pekerja luwih akeh tinimbang sing dibutuhake bakal mbuang memori, nggawe sambungan sing ora aktif, lan nyuda tingkat pooling sambungan. Ing Lyft, wadhah sidecar utusan kita mlaku kanthi konkurensi sing sithik banget supaya kinerja kira-kira cocog karo layanan sing ana ing jejere. Kita mbukak Utusan minangka proksi pinggiran mung kanthi konkurensi maksimal.

Apa tegese non-blocking?

Istilah "non-blocking" wis digunakake kaping pirang-pirang nganti saiki nalika ngrembug babagan cara kerja utas utama lan buruh. Kabeh kode ditulis kanthi asumsi yen ora ana sing diblokir. Nanging, iki ora sakabehe bener (apa sing ora sakabehe bener?).

Utusan nggunakake sawetara kunci proses dawa:

  • Kaya sing wis dibahas, nalika nulis log akses, kabeh benang pekerja entuk kunci sing padha sadurunge buffer log ing memori diisi. Wektu nyekel kunci kudu sithik banget, nanging bisa uga kunci bisa dilawan kanthi konkurensi dhuwur lan throughput sing dhuwur.
  • Utusan nggunakake sistem banget Komplek kanggo nangani statistik sing lokal kanggo thread. Iki bakal dadi topik kiriman sing kapisah. Nanging, aku bakal sebutno sedhela sing minangka bagéan saka ngolah statistik thread lokal, iku kadhangkala perlu kanggo ndarbeni kunci ing tengah "toko statistik". Ngunci iki ora kudu dibutuhake.
  • Utas utama sacara periodik kudu koordinasi karo kabeh benang pekerja. Iki ditindakake kanthi "nerbitake" saka utas utama menyang utas buruh, lan kadhangkala saka utas buruh bali menyang utas utama. Ngirim mbutuhake kunci supaya pesen sing diterbitake bisa antri kanggo pangiriman mengko. Kunci kasebut ora bakal dilawan kanthi serius, nanging isih bisa diblokir kanthi teknis.
  • Nalika Utusan nulis log menyang stream kesalahan sistem (kesalahan standar), entuk kunci ing kabeh proses. Umumé, logging lokal Utusan dianggep nggegirisi saka sudut pandang kinerja, mula ora ana perhatian sing diwenehake kanggo nambah.
  • Ana sawetara kunci acak liyane, nanging ora ana sing kritis kinerja lan ora kudu ditantang.

Utas panyimpenan lokal

Amarga cara Utusan misahake tanggung jawab utas utama saka tanggung jawab utas buruh, ana syarat supaya pangolahan rumit bisa ditindakake ing utas utama lan banjur diwenehake kanggo saben utas buruh kanthi cara sing bebarengan. Bagian iki njlèntrèhaké Envoy Thread Local Storage (TLS) ing tingkat dhuwur. Ing bagean sabanjure aku bakal njlèntrèhaké cara digunakake kanggo ngatur kluster.
[Translation] Model threading utusan

Kaya sing wis diterangake, utas utama nangani meh kabeh fungsi manajemen lan kontrol pesawat ing proses Utusan. Pesawat kontrol rada kakehan ing kene, nanging yen sampeyan ndeleng ing proses Utusan kasebut dhewe lan mbandhingake karo penerusan sing ditindakake dening benang pekerja, mula ana akal. Aturan umum yaiku proses utas utama nindakake sawetara pakaryan, banjur kudu nganyari saben thread buruh miturut asil karya kasebut. ing kasus iki, thread buruh ora perlu kanggo ndarbeni kunci ing saben akses.

Sistem TLS (Thread local storage) Envoy dianggo kaya ing ngisor iki:

  • Kode sing mlaku ing utas utama bisa nyedhiyakake slot TLS kanggo kabeh proses. Senajan iki abstrak, ing laku iku indeks menyang vektor, menehi akses O (1).
  • Utas utama bisa nginstal data kasepakatan menyang slot. Yen wis rampung, data diterbitake kanggo saben thread buruh minangka acara daur ulang normal.
  • Utas pekerja bisa maca saka slot TLS lan njupuk data lokal benang sing kasedhiya ing kana.

Sanajan paradigma sing gampang banget lan luar biasa kuat, meh padha karo konsep pamblokiran RCU (Read-Copy-Update). Ateges, utas buruh ora nate ndeleng owah-owahan data ing slot TLS nalika kerja lagi mlaku. Owah-owahan mung ana sajrone wektu istirahat antarane acara kerja.

Utusan nggunakake iki kanthi rong cara:

  • Kanthi nyimpen data sing beda-beda ing saben benang pekerja, data kasebut bisa diakses tanpa diblokir.
  • Kanthi njaga pointer sing dienggo bareng menyang data global ing mode mung diwaca ing saben thread buruh. Mangkono, saben thread buruh duwe nomer referensi data sing ora bisa dikurangi nalika karya lagi mlaku. Mung nalika kabeh buruh tenang lan ngunggah data bareng anyar, data lawas bakal dirusak. Iki padha karo RCU.

Cluster nganyari threading

Ing bagean iki, aku bakal njlèntrèhaké carane TLS (Thread panyimpenan lokal) digunakake kanggo ngatur kluster. Manajemen kluster kalebu xDS API lan/utawa pangolahan DNS, uga pemeriksaan kesehatan.
[Translation] Model threading utusan

Manajemen aliran cluster kalebu komponen lan langkah ing ngisor iki:

  1. Cluster Manager minangka komponèn ing Envoy sing ngatur kabeh upstreams kluster dikenal, Cluster Discovery Service (CDS) API, Secret Discovery Service (SDS) lan Endpoint Discovery Service (EDS) API, DNS, lan mriksa external aktif. Tanggung jawab kanggo nggawe tampilan "akhire konsisten" saben klompok hulu, sing kalebu host sing ditemokake uga status kesehatan.
  2. Pemeriksa kesehatan nindakake pemeriksaan kesehatan aktif lan nglaporake owah-owahan status kesehatan menyang manajer kluster.
  3. CDS (Layanan Penemuan Kluster) / SDS (Layanan Penemuan Rahasia) / EDS (Layanan Penemuan Titik Akhir) / DNS ditindakake kanggo nemtokake anggota kluster. Owah-owahan negara bali menyang manajer kluster.
  4. Saben thread buruh terus-terusan nglakokake loop acara.
  5. Nalika manajer kluster nemtokake negara kanggo kluster wis diganti, nggawe snapshot mung diwaca saka negara kluster lan dikirim menyang saben thread buruh.
  6. Sajrone periode sepi sabanjuré, thread buruh bakal nganyari snapshot ing slot TLS diparengake.
  7. Sajrone acara I / O sing mesthine nemtokake host kanggo mbukak imbangan, load balancer bakal njaluk slot TLS (Thread local storage) kanggo njupuk informasi babagan host. Iki ora mbutuhake kunci. Elinga uga yen TLS uga bisa micu acara nganyari supaya load balancers lan komponen liyane bisa ngetung maneh cache, struktur data, lsp. Iki ngluwihi orane katrangan saka kirim iki, nanging digunakake ing macem-macem panggonan ing kode.

Nggunakake prosedur ing ndhuwur, Utusan bisa ngolah saben panjalukan tanpa pamblokiran (kajaba kaya sing wis diterangake sadurunge). Kajaba saka kerumitan kode TLS dhewe, umume kode kasebut ora perlu ngerti cara kerjane multithreading lan bisa ditulis nganggo benang tunggal. Iki nggawe paling kode luwih gampang kanggo nulis saliyane kinerja unggul.

Subsistem liyane sing nggunakake TLS

TLS (Thread local storage) lan RCU (Read Copy Update) akeh digunakake ing Utusan.

Tuladhane nggunakake:

  • Mekanisme kanggo ngganti fungsi sajrone eksekusi: Dhaptar fungsi aktif saiki diwilang ing utas utama. Saben thread buruh banjur diwenehi snapshot mung diwaca nggunakake semantik RCU.
  • Ngganti tabel rute: Kanggo tabel rute sing diwenehake dening RDS (Route Discovery Service), tabel rute digawe ing utas utama. Gambar sing diwaca mung bakal diwenehake kanggo saben thread buruh nggunakake semantik RCU (Read Copy Update). Iki nggawe ngganti tabel rute kanthi efisien kanthi atom.
  • cache header HTTP: Ternyata, ngitung header HTTP kanggo saben panyuwunan (nalika mlaku ~ 25K + RPS saben inti) cukup larang. Utusan tengah ngitung header kira-kira saben setengah detik lan nyedhiyakake kanggo saben buruh liwat TLS lan RCU.

Ana kasus liyane, nanging conto sadurunge kudu menehi pangerten sing apik babagan apa sing digunakake TLS.

pitfalls kinerja dikenal

Nalika Envoy nindakake kanthi apik, ana sawetara wilayah penting sing mbutuhake perhatian nalika digunakake kanthi konkurensi lan throughput sing dhuwur banget:

  • Kaya sing diterangake ing artikel iki, saiki kabeh benang pekerja entuk kunci nalika nulis menyang buffer memori log akses. Ing concurrency dhuwur lan throughput dhuwur, sampeyan kudu batch log akses kanggo saben thread buruh ing beyo saka pangiriman out-of-order nalika nulis menyang file final. Utawa, sampeyan bisa nggawe log akses kapisah kanggo saben thread buruh.
  • Sanajan statistik kasebut dioptimalake banget, kanthi konkurensi lan throughput sing dhuwur banget, bakal ana kontroversi atom ing statistik individu. Solusi kanggo masalah iki counters saben thread buruh karo periodik ngreset counters tengah. Iki bakal dibahas ing kirim sabanjure.
  • Arsitektur saiki ora bakal bisa digunakake kanthi apik yen Utusan disebarake ing skenario sing ana sawetara sambungan sing mbutuhake sumber daya pangolahan sing signifikan. Ora ana jaminan manawa sambungan bakal disebarake kanthi rata ing antarane benang pekerja. Iki bisa ditanggulangi kanthi ngleksanakake keseimbangan sambungan pekerja, sing bakal ngidini ijol-ijolan sambungan antarane benang pekerja.

Kesimpulan

Model threading utusan dirancang kanggo nyedhiyakake pemrograman lan paralelisme massive kanthi biaya memori lan sambungan sing bisa boros yen ora dikonfigurasi kanthi bener. Model iki ngidini kanggo nindakake banget ing counts thread dhuwur lan throughput.
Kaya sing dakcritakake ing Twitter, desain kasebut uga bisa mlaku ing ndhuwur tumpukan jaringan mode pangguna lengkap kayata DPDK (Data Plane Development Kit), sing bisa nyebabake server konvensional nangani jutaan panjalukan per detik kanthi proses L7 lengkap. Bakal menarik banget kanggo ndeleng apa sing bakal dibangun ing sawetara taun sabanjure.
Siji komentar cepet pungkasan: Aku wis takon kaping pirang-pirang kok kita milih C ++ kanggo Utusan. Alesane tetep dadi siji-sijine basa kelas industri sing akeh digunakake ing ngendi arsitektur sing diterangake ing postingan iki bisa dibangun. C ++ temtunipun ora cocok kanggo kabeh utawa malah akeh proyèk, nanging kanggo kasus panggunaan tartamtu iku isih mung alat kanggo njaluk proyek rampung.

Pranala menyang kode

Pranala menyang file kanthi antarmuka lan implementasi header sing dibahas ing kirim iki:

Source: www.habr.com

Add a comment