[Тарҷума] Модели риштаи фиристодашуда

Тарҷумаи мақола: Модели риштаи фиристодашуда - https://blog.envoyproxy.io/envoy-threading-model-a8d44b922310

Ман ин мақоларо хеле ҷолиб пайдо кардам ва азбаски Envoy аксар вақт ҳамчун қисми "istio" ё танҳо ҳамчун "назоратчии вуруд" -и кубернетҳо истифода мешавад, аксари одамон бо он робитаи мустақим надоранд, масалан, бо маъмулӣ Насбҳои Nginx ё Haproxy. Бо вуҷуди ин, агар чизе шикаста шавад, хуб мебуд, ки чӣ тавр онро аз дарун фаҳмед. Ман кӯшиш кардам, ки ҳарчи бештари матнро ба забони русӣ тарҷума кунам, аз ҷумла калимаҳои махсус, барои онҳое, ки дидани ин дарднок аст, ман нусхаҳои аслиро дар қавс гузоштам. Хуш омадед ба гурба.

Ҳуҷҷатҳои техникии сатҳи пасти пойгоҳи коди Envoy дар айни замон хеле каманд. Барои ислоҳи ин, ман нақша дорам, ки як қатор мақолаҳои блогро дар бораи зерсистемаҳои гуногуни Envoy таҳия кунам. Азбаски ин мақолаи аввал аст, лутфан ба ман хабар диҳед, ки шумо чӣ фикр доред ва дар мақолаҳои оянда ба чӣ таваҷҷӯҳ доред.

Яке аз саволҳои маъмултарини техникӣ, ки ман дар бораи Envoy мегирам, ин талаб кардани тавсифи сатҳи пасти модели риштае мебошад, ки он истифода мебарад. Дар ин паём, ман тавсиф хоҳам кард, ки чӣ тавр Envoy пайвастҳоро ба риштаҳо харита мекунад ва инчунин системаи нигаҳдории маҳаллии Thread, ки дар дохили он истифода мебарад, кодро параллелтар ва самараноктар кунад.

Баррасии ришта

[Тарҷума] Модели риштаи фиристодашуда

Envoy се намуди ҷараёнро истифода мебарад:

  • Асосӣ: Ин ришта оғоз ва қатъи равандҳо, тамоми коркарди API-и XDS (xDiscovery), аз ҷумла DNS, санҷиши саломатӣ, идоракунии кластери умумӣ ва вақти корӣ, аз нав танзимкунии омор, маъмурият ва идоракунии умумии раванд - сигналҳои Linux. бозоғозкунии гарм ва ғайраҳоро назорат мекунад. рух медиҳад дар ин ришта асинхронӣ ва "ғайрибандӣ" аст. Умуман, риштаи асосӣ ҳама равандҳои функсионалии муҳимро ҳамоҳанг мекунад, ки барои кор миқдори зиёди CPU-ро талаб намекунанд. Ин имкон медиҳад, ки аксари кодҳои идоракунӣ тавре навишта шаванд, ки гӯё он як ришта дошта бошад.
  • Коргар: Бо нобаёнӣ, Envoy барои ҳар як риштаи сахтафзор дар система риштаи коргариро эҷод мекунад, онро бо истифода аз опсия идора кардан мумкин аст --concurrency. Ҳар як риштаи корӣ як ҳалқаи рӯйдодҳои "банднашаванда" -ро иҷро мекунад, ки барои гӯш кардани ҳар як шунаванда масъул аст; дар вақти навиштан (29 июли 2017) ҳеҷ гуна тақсими шунаванда, қабули пайвастҳои нав, эҷод кардани стек филтр барои пайвастшавӣ ва коркарди ҳама амалиёти воридот/баромад (IO) дар тӯли тамоми умри пайвастшавӣ. Боз ҳам, ин имкон медиҳад, ки аксари рамзи коркарди пайвастшавӣ тавре навишта шаванд, ки гӯё он як ришта дошта бошад.
  • Тозакунандаи файл: Ҳар як файле, ки Envoy менависад, асосан ба гузоришҳо дастрасӣ дорад, дар айни замон риштаи блоки мустақил дорад. Ин ба он вобаста аст, ки навиштан ба файлҳои аз ҷониби системаи файлӣ кэшшуда ҳатто ҳангоми истифода O_NONBLOCK баъзан банд шуда метавонад (оҳе). Вақте ки риштаҳои корӣ бояд ба файл навишта шаванд, маълумот воқеан ба буфери хотира интиқол дода мешавад, ки дар ниҳоят он тавассути ришта тоза карда мешавад. тоза кардани файл. Ин як майдони рамзест, ки дар он аз ҷиҳати техникӣ ҳама риштаҳои коргарӣ ҳангоми кӯшиши пур кардани буфери хотира метавонанд як қулфро маҳкам кунанд.

Муносибати пайвастшавӣ

Тавре ки ба таври мухтасар дар боло муҳокима карда шуд, ҳама риштаҳои коргарӣ ба ҳама шунавандагон гӯш медиҳанд. Ҳамин тариқ, ядро ​​барои ба таври зебо фиристодани розеткаҳои қабулшуда ба риштаҳои корӣ истифода мешавад. Ядроҳои муосир одатан дар ин кор хеле хубанд, онҳо хусусиятҳоеро ба монанди афзоиши афзалияти вуруд / баромад (IO) истифода мебаранд, то кӯшиш кунанд, ки риштаро бо кор пур кунанд, пеш аз оғози истифодаи риштаҳои дигар, ки дар як розетка гӯш мекунанд ва инчунин робини мудавварро истифода намебаранд. қулфкунӣ (Spinlock) барои коркарди ҳар як дархост.
Вақте ки пайвастшавӣ дар риштаи коргарӣ қабул карда мешавад, он ҳеҷ гоҳ ин риштаро тарк намекунад. Ҳама коркарди минбаъдаи пайвастшавӣ пурра дар риштаи коргарӣ, аз ҷумла ҳама гуна рафтори интиқолӣ иҷро карда мешавад.

Ин якчанд оқибатҳои муҳим дорад:

  • Ҳама ҳавзҳои пайвастшавӣ дар Envoy ба риштаи коргар таъин карда мешаванд. Ҳамин тавр, гарчанде ки ҳавзҳои пайвасти HTTP/2 дар як вақт танҳо як пайвастшавӣ ба ҳар як мизбони болообро анҷом медиҳанд, агар чаҳор риштаи корӣ мавҷуд бошанд, дар ҳолати устувор дар як ҳости боло чаҳор пайвасти HTTP/2 хоҳад буд.
  • Сабаби ин тавр кор кардани Envoy дар он аст, ки бо нигоҳ доштани ҳама чиз дар як риштаи коргарӣ, қариб ҳама кодро метавон бидуни блок ва гӯё як риштаи ягона навишт. Ин тарҳ навиштани рамзҳои зиёдеро осон мекунад ва миқёси бениҳоят хубро ба шумораи қариб номаҳдуди риштаҳои коргарӣ осон мекунад.
  • Аммо, яке аз баррасиҳои асосӣ ин аст, ки аз нуқтаи назари ҳавзи хотира ва самаранокии пайвастшавӣ, танзим кардани --concurrency. Доштани бештари риштаҳои коргарӣ аз зарурӣ хотираро беҳуда сарф мекунад, пайвастагиҳои бештари бекорро эҷод мекунад ва суръати ҷамъшавии пайвастро коҳиш медиҳад. Дар Lyft, контейнерҳои паҳлӯии фиристодаи мо бо ҳамзамон хеле кам кор мекунанд, то ки иҷроиш тақрибан ба хидматҳое, ки дар паҳлӯи онҳо нишастаанд, мувофиқат кунад. Мо Envoy-ро ҳамчун прокси канорӣ танҳо дар баробари ҳадди аксар иҷро мекунем.

Бебанд кардан чӣ маъно дорад?

Истилоҳи "бебандӣ" то кунун чанд маротиба ҳангоми муҳокимаи тарзи кор кардани риштаҳои асосӣ ва коргарӣ истифода шудааст. Ҳама рамзҳо бо он навишта шудаанд, ки ҳеҷ чиз ҳеҷ гоҳ баста нашудааст. Аммо, ин комилан дуруст нест (чӣ комилан дуруст нест?).

Envoy якчанд қуфлҳои раванди дарозро истифода мебарад:

  • Тавре ки баррасӣ шуд, ҳангоми навиштани гузоришҳои дастрасӣ, ҳамаи риштаҳои корӣ пеш аз пур шудани буфери сабти хотира як қулфро ба даст меоранд. Мӯҳлати нигоҳдории қулф бояд хеле кам бошад, аммо имкон дорад, ки қулф бо ҳамзамон ва қобилияти баланд баҳс карда шавад.
  • Envoy системаи хеле мураккабро барои коркарди омори маҳаллӣ истифода мебарад. Ин мавзӯи мақолаи алоҳида хоҳад буд. Бо вуҷуди ин, ман ба таври мухтасар қайд мекунам, ки ҳамчун як қисми коркарди омори ришта ба таври маҳаллӣ, баъзан лозим меояд, ки қулф дар "мағозаи оморӣ"-и марказӣ ба даст оварда шавад. Ин қулф набояд ҳеҷ гоҳ талаб карда шавад.
  • Риштаи асосӣ бояд давра ба давра бо ҳама риштаҳои коргарӣ ҳамоҳанг шавад. Ин аз риштаи асосӣ ба риштаҳои коргарӣ ва баъзан аз риштаҳои коргарӣ боз ба риштаи асосӣ "нашр кардан" анҷом дода мешавад. Фиристодан қулфро талаб мекунад, то паёми нашршуда барои расонидани дертар дар навбат гузошта шавад. Ин қуфлҳо набояд ҳеҷ гоҳ ба таври ҷиддӣ баҳс карда шаванд, аммо онҳо ба ҳар ҳол метавонанд аз ҷиҳати техникӣ баста шаванд.
  • Вақте ки Envoy сабтро ба ҷараёни хатои система (хатои стандартӣ) менависад, он тамоми равандро қулф мекунад. Умуман, дарахтбурии маҳаллӣ аз нуқтаи назари фаъолият даҳшатнок ҳисобида мешавад, бинобар ин ба беҳтар кардани он аҳамияти зиёд дода намешавад.
  • Якчанд қуфлҳои тасодуфии дигар вуҷуд доранд, аммо ҳеҷ яке аз онҳо иҷрои интиқодӣ надоранд ва ҳеҷ гоҳ набояд мавриди баҳс қарор гиранд.

Захираи маҳаллӣ

Аз сабаби он ки фиристода масъулияти риштаи асосиро аз масъулияти риштаи коргарӣ ҷудо мекунад, талабот вуҷуд дорад, ки коркарди мураккабро дар риштаи асосӣ анҷом дода, сипас ба ҳар як риштаи коргар ба таври хеле ҳамоҳангшуда таъмин карда шавад. Ин бахш захираи маҳаллии Envoy Thread (TLS) -ро дар сатҳи баланд тавсиф мекунад. Дар фасли оянда ман тасвир мекунам, ки он барои идоракунии кластер чӣ гуна истифода мешавад.
[Тарҷума] Модели риштаи фиристодашуда

Тавре ки аллакай тавсиф шудааст, риштаи асосӣ амалан тамоми функсияҳои идоракунии ҳавопайморо дар раванди фиристодан идора мекунад. Ҳавопаймои идоракунӣ дар ин ҷо каме изофабор аст, аммо вақте ки шумо онро дар дохили худи раванди фиристодан мебинед ва онро бо интиқоле, ки риштаҳои коргар мекунанд, муқоиса мекунед, ин маъно дорад. Қоидаи умумӣ ин аст, ки раванди риштаи асосӣ баъзе корҳоро иҷро мекунад ва пас аз он бояд ҳар як риштаи коргариро мувофиқи натиҷаи ин кор нав кунад. дар ин ҳолат, риштаи коргар лозим нест, ки дар ҳар як дастрасӣ қулф пайдо кунад.

Системаи TLS (Thread local storage) фиристодашуда чунин кор мекунад:

  • Рамзе, ки дар риштаи асосӣ кор мекунад, метавонад барои тамоми раванд слотҳои TLS ҷудо кунад. Гарчанде ки ин абстрактӣ аст, дар амал он индекс ба вектор буда, дастрасии O(1)-ро таъмин мекунад.
  • Риштаи асосӣ метавонад маълумоти ихтиёриро ба слоташ насб кунад. Вақте ки ин анҷом дода мешавад, маълумот ба ҳар як риштаи коргар ҳамчун як ҳодисаи ҳалқаи муқаррарии ҳодиса нашр мешавад.
  • Риштаҳои коргарӣ метавонанд аз слотҳои TLS-и худ хонанд ва ҳама гуна маълумоти риштаи маҳаллиро дар он ҷо дастрас кунанд.

Гарчанде ки он парадигмаи хеле содда ва бениҳоят пурқувват аст, он ба консепсияи блоки RCU (Хондан-Нусхабардорӣ-Навсозӣ) хеле монанд аст. Аслан, риштаҳои коргарӣ ҳеҷ гоҳ тағирёбии маълумотро дар слотҳои TLS ҳангоми иҷро шудани кор намебинанд. Тағйирот танҳо дар давраи истироҳат байни рӯйдодҳои корӣ ба амал меояд.

Фиристода аз ин бо ду тарз истифода мебарад:

  • Бо нигоҳ доштани маълумоти гуногун дар ҳар як риштаи коргар, маълумотро бе ягон басташавӣ дастрас кардан мумкин аст.
  • Бо нигоҳ доштани нишоннамои муштарак ба маълумоти глобалӣ дар ҳолати танҳо барои хондан дар ҳар як риштаи коргар. Ҳамин тариқ, ҳар як риштаи коргар дорои шумораи истинодҳои додаҳо мебошад, ки ҳангоми иҷрои кор кам карда намешавад. Танҳо вақте ки ҳамаи коргарон ором мешаванд ва маълумоти нави муштаракро бор мекунанд, маълумоти кӯҳна нест карда мешаванд. Ин ба RCU шабеҳ аст.

Раванди навсозии кластер

Дар ин бахш ман шарҳ медиҳам, ки чӣ тавр TLS (Thread storage local) барои идоракунии кластер истифода мешавад. Идоракунии кластер xDS API ва/ё коркарди DNS, инчунин санҷиши саломатиро дар бар мегирад.
[Тарҷума] Модели риштаи фиристодашуда

Идоракунии ҷараёни кластер ҷузъҳо ва қадамҳои зеринро дар бар мегирад:

  1. Менеҷери кластер ҷузъе дар дохили Envoy мебошад, ки ҳамаи кластерҳои маълуми болообро идора мекунад, API-и Хадамоти кашфи кластер (CDS), API-ҳои махфии кашф (SDS) ва хадамоти кашфи ниҳоӣ (EDS), DNS ва санҷишҳои фаъоли берунаро тафтиш мекунад. Он барои эҷоди намуди "ниҳоят муттасил"-и ҳар як кластери болооб масъул аст, ки ҳостҳои кашфшуда ва инчунин вазъи саломатиро дар бар мегирад.
  2. Санҷиши саломатӣ санҷиши фаъоли саломатиро анҷом медиҳад ва дар бораи тағйироти вазъи саломатӣ ба мудири кластер хабар медиҳад.
  3. CDS (Хадамоти кашфи кластер) / SDS (Хадамоти кашфи махфӣ) / EDS (Хизмати кашфи ниҳоӣ) / DNS барои муайян кардани узвияти кластер анҷом дода мешаванд. Тағйирёбии ҳолат ба мудири кластер баргардонида мешавад.
  4. Ҳар як риштаи коргар пайваста як даври ҳодисаро иҷро мекунад.
  5. Вақте ки мудири кластер муайян мекунад, ки ҳолати кластер тағир ёфтааст, он тасвири нави танҳо барои хондан ҳолати кластерро эҷод мекунад ва онро ба ҳар як риштаи коргар мефиристад.
  6. Дар давраи оромии оянда, риштаи коргар тасвири фаврӣ дар ковокии ҷудошудаи TLS-ро нав мекунад.
  7. Дар ҷараёни як ҳодисаи воридот / баромад, ки бояд ҳост барои тавозуни боркуниро муайян кунад, мувозинаткунандаи сарборӣ барои гирифтани маълумот дар бораи ҳост слотро TLS (Thread anbar локалии) дархост мекунад. Ин қуфлҳоро талаб намекунад. Инчунин дар хотир доред, ки TLS инчунин метавонад рӯйдодҳои навсозиро оғоз кунад, то мувозинатҳои сарборӣ ва дигар ҷузъҳо кэшҳо, сохторҳои додаҳо ва ғайраҳоро дубора ҳисоб кунанд. Ин аз доираи ин паём берун аст, аммо дар ҷойҳои гуногуни код истифода мешавад.

Бо истифода аз расмиёти дар боло зикршуда, фиристода метавонад ҳар як дархостро бе ягон бастакунӣ коркард кунад (ба истиснои он чизе, ки қаблан тавсиф шуда буд). Ба ғайр аз мураккабии худи коди TLS, аксари рамзҳо лозим нест, ки фаҳманд, ки чӣ тавр бисёр ришта кор мекунад ва онро бо як ришта навиштан мумкин аст. Ин ба ғайр аз иҷрои олӣ навиштани аксари рамзҳоро осон мекунад.

Дигар зерсистемаҳое, ки TLS-ро истифода мебаранд

TLS (Thread storage local) ва RCU (Read Copy Update) дар Envoy васеъ истифода мешаванд.

Намунаҳои истифодаи:

  • Механизми тағир додани функсияҳо ҳангоми иҷро: Рӯйхати ҷории функсияҳои фаъол дар риштаи асосӣ ҳисоб карда мешавад. Пас аз он ба ҳар як риштаи коргар тасвири танҳо барои хондан бо истифода аз семантикаи RCU дода мешавад.
  • Иваз кардани ҷадвалҳои хатсайрҳо: Барои ҷадвалҳои масир, ки аз ҷониби RDS (Хадамоти кашфи масир) пешниҳод шудааст, ҷадвалҳои масир дар риштаи асосӣ сохта мешаванд. Баъдан тасвири танҳо барои хондан ба ҳар як риштаи коргар бо истифода аз семантикаи RCU (Read Copy Update) дода мешавад. Ин тағир додани ҷадвалҳои масирро аз ҷиҳати атом самаранок мегардонад.
  • Кэшкунии сарлавҳаи HTTP: Тавре маълум мешавад, ҳисоб кардани сарлавҳаи HTTP барои ҳар як дархост (ҳангоми иҷро кардани ~25K+ RPS барои як ядро) хеле гарон аст. Фиристода ба таври мутамарказ сарлавҳаро тақрибан ҳар ним сония ҳисоб мекунад ва онро ба ҳар як коргар тавассути TLS ва RCU медиҳад.

Ҳолатҳои дигар вуҷуд доранд, аммо мисолҳои қаблӣ бояд фаҳмиши хуби TLS барои чӣ истифода шаванд.

Камбудиҳои маълуми иҷроиш

Гарчанде ки Envoy дар маҷмӯъ хеле хуб кор мекунад, якчанд самтҳои назаррас мавҷуданд, ки ҳангоми истифодаи он бо ҳамзамон ва қобилияти хеле баланд таваҷҷӯҳро талаб мекунанд:

  • Тавре ки дар ин мақола тавсиф шудааст, дар айни замон ҳамаи риштаҳои корӣ ҳангоми навиштан ба буфери хотираи сабти дастрасӣ қулф мегиранд. Ҳангоми ҳамоҳангии баланд ва қобилияти баланд, ба шумо лозим меояд, ки ҳангоми навиштан ба файли ниҳоӣ гузоришҳои дастрасиро барои ҳар як риштаи коргарӣ аз ҳисоби интиқоли ғайримуқаррарӣ ҷамъ кунед. Интихобан, шумо метавонед барои ҳар як риштаи коргар сабти дастрасии алоҳида эҷод кунед.
  • Гарчанде ки омор хеле оптимизатсия карда шудааст, дар як ҳамоҳангӣ ва интиқоли хеле баланд эҳтимол дар омори инфиродӣ ихтилофи атомӣ вуҷуд хоҳад дошт. Ҳалли ин мушкилот ҳисобкунакҳо барои як риштаи коргар бо аз нав танзимкунии даврии ҳисобкунакҳои марказӣ мебошад. Дар ин бора дар мақолаи минбаъда муҳокима карда мешавад.
  • Меъмории кунунӣ хуб кор намекунад, агар Envoy дар сенарияе ҷойгир карда шавад, ки дар он пайвастҳои хеле кам мавҷуданд, ки захираҳои назарраси коркардро талаб мекунанд. Ҳеҷ кафолате нест, ки пайвастҳо дар байни риштаҳои коргарӣ баробар тақсим карда мешаванд. Инро тавассути татбиқи мувозинати пайвасти коргарӣ ҳал кардан мумкин аст, ки имкон медиҳад мубодилаи робитаҳо байни риштаҳои коргарӣ.

Хулоса

Модели риштаи Envoy тарҳрезӣ шудааст, ки осонии барномасозӣ ва параллелизми азимро аз ҳисоби хотираи эҳтимолан исрофкорӣ ва пайвастҳо, агар дуруст танзим нашуда бошад, таъмин кунад. Ин модел ба он имкон медиҳад, ки дар миқдори зиёди риштаҳо ва интиқоли он хеле хуб кор кунад.
Тавре ки ман ба таври мухтасар дар Twitter қайд кардам, тарроҳӣ инчунин метавонад дар болои стеки шабакавии пурраи корбарӣ ба мисли DPDK (Маҷмӯаи таҳияи маълумотҳо) кор кунад, ки метавонад ба серверҳои анъанавӣ миллионҳо дархостҳоро дар як сония бо коркарди пурраи L7 расонад. Бубинед, ки дар чанд соли оянда чӣ сохта мешавад, хеле ҷолиб хоҳад буд.
Як шарҳи охирин: Аз ман борҳо пурсиданд, ки чаро мо C++-ро барои фиристодан интихоб кардем. Сабаб он аст, ки он то ҳол ягона забони васеъ истифодашавандаи дараҷаи саноатӣ мебошад, ки дар он меъмории дар ин мақола тавсифшуда сохта мешавад. C++ бешубҳа барои ҳама ё ҳатто бисёр лоиҳаҳо мувофиқ нест, аммо барои баъзе мавридҳои истифода он то ҳол ягона воситаи анҷом додани кор аст.

Истинодҳо ба код

Истинодҳо ба файлҳо бо интерфейсҳо ва татбиқи сарлавҳаҳо дар ин мақола муҳокима карда мешаванд:

Манбаъ: will.com

Илова Эзоҳ