Маҳдудияти CPU ва фишори хашмгин дар Kubernetes

Шарҳ. тарҷума.: Ин таърихи ҷолиби Омио - агрегатори сайёҳии аврупоӣ - хонандагонро аз назарияи асосӣ ба нозукиҳои амалии ҷолиби конфигуратсияи Кубернетес мебарад. Шинос шудан бо чунин ҳолатҳо на танҳо барои васеъ кардани ҷаҳонбинии шумо, балки инчунин пешгирии мушкилоти ночиз кӯмак мекунад.

Маҳдудияти CPU ва фишори хашмгин дар Kubernetes

Оё шумо ягон бор будед, ки ариза дар ҷояш часпида бошад, посух додан ба санҷишҳои саломатиро бас кунед ва фаҳмед, ки чаро? Як шарҳи имконпазир бо маҳдудияти квотаҳои CPU алоқаманд аст. Ин аст он чизе ки мо дар ин мақола сӯҳбат хоҳем кард.

ХИБ; DR:
Мо қатъиян тавсия медиҳем, ки маҳдудиятҳои CPU дар Kubernetes (ё ғайрифаъол кардани квотаҳои CFS дар Kubelet), агар шумо версияи ядрои Linux-ро бо хатогии квотаи CFS истифода баред. Дар асл вуҷуд дорад ҷиддӣ ва машҳур хатогие, ки боиси аз ҳад зиёд ва таъхирҳо мегардад
.

Дар Омио тамоми инфрасохторро Кубернетес идора мекунад. Ҳама сарбории кории давлатӣ ва бешаҳрвандии мо танҳо дар Kubernetes иҷро мешаванд (мо Google Kubernetes Engine-ро истифода мебарем). Дар шаш моҳи охир мо ба мушоҳидаи сустшавии тасодуфӣ шурӯъ кардем. Барномаҳо ях мекунанд ё посух додан ба санҷишҳои саломатиро қатъ мекунанд, пайвастшавӣ ба шабакаро гум мекунанд ва ғайра. Ин рафтор моро муддати тӯлонӣ дар ҳайрат гузошт ва дар ниҳоят мо тасмим гирифтем, ки мушкилотро ҷиддӣ қабул кунем.

Хулосаи мақола:

  • Чанд сухан дар бораи контейнерҳо ва Кубернетҳо;
  • Чӣ тавр дархостҳо ва маҳдудиятҳои CPU амалӣ карда мешаванд;
  • Чӣ тавр маҳдудияти CPU дар муҳитҳои бисёрсоҳавӣ кор мекунад;
  • Чӣ тавр пайгирӣ кардани фишори CPU;
  • Ҳалли мушкилот ва нозукиҳо.

Якчанд сухан дар бораи контейнерҳо ва Kubernetes

Kubernetes аслан стандарти муосир дар ҷаҳони инфрасохтор мебошад. Вазифаи асосии он оркестри контейнерӣ мебошад.

Контейнерҳо

Дар гузашта ба мо лозим омад, ки артефактҳо ба монанди Java JARs/WARs, Python Eggs ё файлҳои иҷрошавандаро барои кор дар серверҳо эҷод кунем. Бо вуҷуди ин, барои кор кардани онҳо, бояд корҳои иловагӣ анҷом дода шаванд: насб кардани муҳити корӣ (Java/Python), ҷойгир кардани файлҳои зарурӣ дар ҷойҳои лозима, таъмини мутобиқат бо версияи мушаххаси системаи оператсионӣ ва ғайра. Ба ибораи дигар, бояд ба идоракунии конфигуратсия диққати ҷиддӣ дода шавад (ки аксар вақт манбаи баҳс байни таҳиягарон ва маъмурони система буд).

Контейнерҳо ҳама чизро иваз карданд. Ҳоло артефакт тасвири контейнер аст. Онро метавон ҳамчун як намуди файли иҷрошавандаи васеъ муаррифӣ кард, ки дорои на танҳо барнома, балки муҳити мукаммали иҷрошаванда (Java/Python/...), инчунин файлҳо/бастаҳои зарурӣ, ки қаблан насб карда шудаанд ва омодаанд давидан. Контейнерҳоро бе ягон қадами иловагӣ дар серверҳои гуногун ҷойгир кардан ва кор кардан мумкин аст.

Илова бар ин, контейнерҳо дар муҳити қуттии худ кор мекунанд. Онҳо адаптери шабакаи виртуалии худ, системаи файлии худро бо дастрасии маҳдуд, иерархияи равандҳои худ, маҳдудиятҳои худ дар CPU ва хотира ва ғайра доранд. Ҳамаи ин ба шарофати зерсистемаи махсуси ядрои Linux - фазоҳои номҳо амалӣ карда мешавад.

Кубернитель

Тавре ки қаблан гуфта шуд, Кубернетес оркестри контейнер мебошад. Ин чунин кор мекунад: шумо ба он як ҳавзи мошинҳо медиҳед ва сипас мегӯед: "Ҳей, Кубернетес, биёед даҳ мисоли контейнери маро бо 2 протсессор ва ҳар яки 3 ГБ хотира ба кор андозем ва онҳоро идома диҳем!" Боқимондаашро Кубернетес ҳал мекунад. Он иқтидори ройгонро пайдо мекунад, контейнерҳоро оғоз мекунад ва дар ҳолати зарурӣ онҳоро бозоғоз мекунад, ҳангоми тағир додани версияҳо навсозиро паҳн мекунад ва ғайра. Аслан, Kubernetes ба шумо имкон медиҳад, ки ҷузъи сахтафзорро абстраксия кунед ва системаҳои гуногунро барои ҷойгиркунӣ ва иҷро кардани барномаҳо мувофиқ созед.

Маҳдудияти CPU ва фишори хашмгин дар Kubernetes
Кубернетес аз нуктаи на-зари одамои

Дар Кубернетес дархостҳо ва маҳдудиятҳо чист

Хуб, мо контейнерҳо ва Кубернетҳоро пӯшонидем. Мо инчунин медонем, ки якчанд контейнерҳо метавонанд дар як мошин ҷойгир шаванд.

Аналогияро бо квартираи коммуналй овардан мумкин аст. Бинои васеъ (мошинҳо / агрегатҳо) гирифта, ба якчанд иҷорагир (контейнер) иҷора дода мешавад. Кубернетес ҳамчун риэлтор фаъолият мекунад. Саволе ба миён меояд, ки ичоракоронро чй тавр аз чанчол бо якдигар нигох доштан мумкин аст? Чӣ мешавад, агар яке аз онҳо, бигӯед, тасмим гирад, ки ҳаммомро барои ним рӯз қарз гирад?

Дар ин ҷо дархостҳо ва маҳдудиятҳо бозӣ мекунанд. ВПМ - Воҳиди Пардозиши Марказӣ дархост танҳо барои мақсадҳои банақшагирӣ лозим аст. Ин чизе монанди "рӯйхати хоҳишҳо" -и контейнер аст ва он барои интихоби гиреҳи мувофиқтарин истифода мешавад. Дар айни замон CPU ҳудуд бо шартномаи иҷора муқоиса кардан мумкин аст - ҳамин ки мо як воҳиди контейнерро интихоб мекунем, ба наметавонад аз хаддхои мукар-раршуда берун бароянд. Ва дар ин ҷо мушкилот ба миён меояд ...

Чӣ гуна дархостҳо ва маҳдудиятҳо дар Кубернетес татбиқ карда мешаванд

Кубернетес барои амалӣ кардани маҳдудиятҳои CPU як механизми тротлингро (гузариши давраҳои соат) истифода мебарад, ки дар ядро ​​сохта шудааст. Агар барнома аз меъёр зиёд бошад, тротлинг фаъол мешавад (яъне он давраҳои камтари CPU мегирад). Дархостҳо ва маҳдудиятҳо барои хотира ба таври гуногун ташкил карда шудаанд, аз ин рӯ ошкор кардани онҳо осонтар аст. Барои ин, танҳо ҳолати охирини бозоғозкунии подкастро тафтиш кунед: оё он "OOMKilled" аст. Тозакунии CPU он қадар осон нест, зеро K8s метрикаро танҳо аз рӯи истифода дастрас мекунад, на аз рӯи гурӯҳҳо.

Дархости CPU

Маҳдудияти CPU ва фишори хашмгин дар Kubernetes
Чӣ тавр дархости CPU амалӣ карда мешавад

Барои содда, биёед ба раванди истифодаи мошин бо CPU-и 4-аслӣ ҳамчун намуна назар кунем.

K8s механизми гурӯҳи назоратро (гурӯҳҳо) барои назорати тақсимоти захираҳо (хотира ва протсессор) истифода мебарад. Барои он модели иерархӣ мавҷуд аст: кӯдак ҳудуди гурӯҳи волидайнро мерос мегирад. Тафсилоти тақсимот дар системаи файлии виртуалӣ нигоҳ дошта мешавад (/sys/fs/cgroup). Дар мавриди протсессор ин аст /sys/fs/cgroup/cpu,cpuacct/*.

K8s файлро истифода мебарад cpu.share барои чудо кардани ресурсхои протсессор. Дар ҳолати мо, гурӯҳи решавӣ 4096 саҳмияи захираҳои CPU - 100% қувваи дастраси протсессориро мегирад (1 ядро ​​= 1024; ин арзиши собит аст). Гурӯҳи решавӣ захираҳоро мутаносибан вобаста ба ҳиссаи наслҳои ба қайд гирифташуда тақсим мекунад cpu.share, ва онхо хам дар навбати худ бо авлоди худ хамин тавр мекунанд ва гайра. Дар гиреҳи маъмулии Кубернетес, гурӯҳи реша се фарзанд дорад: system.slice, user.slice и kubepods. Ду зергурӯҳи аввал барои тақсими захираҳо байни сарбориҳои муҳими система ва барномаҳои корбар берун аз K8s истифода мешаванд. Охирин - kubepods - аз ҷониби Kubernetes барои тақсим кардани захираҳо дар байни pods сохта шудааст.

Диаграммаи дар боло овардашуда нишон медиҳад, ки зергурӯҳҳои якум ва дуюм ҳар кадомро гирифтаанд 1024 саҳмияҳо, бо зергурӯҳи kuberpod ҷудо карда шудааст 4096 саҳмияҳо Ин чӣ гуна имконпазир аст: дар ниҳоят, гурӯҳи реша танҳо дастрасӣ дорад 4096 саҳмияҳо буда, маблағи саҳмияҳои насли ӯ аз ин шумора хеле зиёд аст (6144)? Гап дар он аст, ки арзиш мантиқӣ дорад, бинобар ин, ҷадвали Linux (CFS) онро барои мутаносиб тақсим кардани захираҳои CPU истифода мебарад. Дар мо бошад, ду гурухи аввал мегиранд 680 саҳмияҳои воқеӣ (16,6% аз 4096) ва kubepod боқимонда мегирад 2736 саҳмияҳо Дар сурати бекористии ду гурухи аввал аз захирахои чудошуда истифода намебаранд.

Хушбахтона, банақшагир дорои механизмест, ки аз сарфи беҳуда сарф кардани захираҳои CPU истифоданашуда пешгирӣ мекунад. Он иқтидори "бекор" -ро ба ҳавзи глобалӣ интиқол медиҳад, ки аз он ба гурӯҳҳое тақсим карда мешавад, ки ба қувваи иловагии протсессор ниёз доранд (интиқол дар гурӯҳҳо барои пешгирӣ кардани талафоти яклухт сурат мегирад). Усули шабеҳ ба ҳамаи наслҳои наслҳо татбиқ карда мешавад.

Ин механизм тақсимоти одилонаи қудрати протсессорро таъмин мекунад ва кафолат медиҳад, ки ҳеҷ кас захираҳоро аз дигарон "дуздӣ" накунад.

Маҳдудияти CPU

Сарфи назар аз он, ки конфигуратсияҳои маҳдудиятҳо ва дархостҳо дар K8 ба ҳам монанданд, татбиқи онҳо ба куллӣ фарқ мекунад: ин аз ҳама гумроҳкунанда ва қисми камтарини ҳуҷҷатгузорӣ.

K8s машғул аст Механизми квота CFS ба амал баровардани лимитхо. Танзимоти онҳо дар файлҳо нишон дода шудаанд cfs_period_us и cfs_quota_us дар феҳристи cgroup (файл низ дар он ҷо ҷойгир аст cpu.share).

Баръакси cpu.share, квота дар асоси давраи вақт, ва на дар бораи қудрати протсессори дастрас. cfs_period_us давомнокии давраро (давра) муайян мекунад - он ҳамеша 100000 мкс (100 мс) аст. Имконияти тағир додани ин арзиш дар K8s вуҷуд дорад, аммо он ҳоло танҳо дар алфа дастрас аст. Барномасоз давраро барои аз нав оғоз кардани квотаҳои истифодашуда истифода мебарад. Файли дуюм cfs_quota_us, вақти дастрасро (квота) дар ҳар як давра муайян мекунад. Дар хотир доред, ки он инчунин дар микросекундҳо нишон дода шудааст. Квота метавонад аз дарозии давра зиёд бошад; ба ибораи дигар, он метавонад аз 100 мс зиёдтар бошад.

Биёед ду сенарияро дар мошинҳои 16-аслӣ бубинем (навъи маъмултарини компютере, ки мо дар Omio дорем):

Маҳдудияти CPU ва фишори хашмгин дар Kubernetes
Сенарияи 1: 2 ришта ва маҳдудияти 200 мс. Не дроссель

Маҳдудияти CPU ва фишори хашмгин дар Kubernetes
Сенарияи 2: маҳдудияти 10 ришта ва 200 мс. Тозакунӣ пас аз 20 мс оғоз меёбад, дастрасӣ ба захираҳои протсессор пас аз 80 мс дубора барқарор мешавад

Фарз мекунем, ки шумо маҳдудияти CPU-ро муқаррар кардаед 2 ядроҳо; Кубернетес ин арзишро ба 200 мс тарҷума мекунад. Ин маънои онро дорад, ки контейнер метавонад ҳадди аксар 200ms вақти CPU-ро бидуни фишор истифода барад.

Ва дар ин ҷо фароғат оғоз мешавад. Тавре ки дар боло зикр гардид, квотаи дастрас 200 мс аст. Агар шумо параллел кор карда истода бошед ten риштаҳо дар мошини 12-аслӣ (нигаред ба расм барои сенарияи 2), дар ҳоле ки ҳамаи подкҳои дигар бекоранд, квота ҳамагӣ дар 20 мс тамом мешавад (аз 10 * 20 мс = 200 мс) ва ҳамаи риштаҳои ин подкаст овезон хоҳанд шуд » (газ) барои 80 ms оянда. Он чизе, ки аллакай зикр шудааст хатои нақшакаш, ки аз хад зиёд дроссел ба амал меояд ва контейнер хатто нормаи мавчударо ичро карда наметавонад.

Чӣ тавр баҳо додан мумкин аст, ки дросселро дар қуттиҳо арзёбӣ кунем?

Танҳо ба подкаст ворид шавед ва иҷро кунед cat /sys/fs/cgroup/cpu/cpu.stat.

  • nr_periods - шумораи умумии давраҳои нақшавӣ;
  • nr_throttled — шумораи давраҳои дротлле дар таркиб nr_periods;
  • throttled_time - вақти ҷамъшуда дар наносонияҳо.

Маҳдудияти CPU ва фишори хашмгин дар Kubernetes

Дар ҳақиқат чӣ мешавад?

Дар натиҷа, мо дар ҳама барномаҳо фишори баланд мегирем. Баъзан ӯ дар якуним баробар қавитар аз ҳисоб!

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

Қарор ва оқибатҳои

Дар ин ҷо ҳама чиз оддӣ аст. Мо маҳдудиятҳои CPU-ро тарк кардем ва навсозии ядрои ОС-ро дар кластерҳо ба версияи охирини он оғоз кардем, ки хатогӣ ислоҳ карда шуд. Шумораи хатогиҳо (HTTP 5xx) дар хидматҳои мо фавран ба таври назаррас коҳиш ёфт:

Хатогиҳои HTTP 5xx

Маҳдудияти CPU ва фишори хашмгин дар Kubernetes
Хатогиҳои HTTP 5xx барои як хидмати муҳим

Вақти вокуниш p95

Маҳдудияти CPU ва фишори хашмгин дар Kubernetes
Таъхири дархости хидматрасонии интиқодӣ, фоизи 95-ум

Хароҷоти амалиётӣ

Маҳдудияти CPU ва фишори хашмгин дар Kubernetes
Шумораи соатҳои сарфшуда

Чӣ сайд аст?

Чунон ки дар аввали мақола гуфта шудааст:

Аналогияро бо квартираи коммуналй овардан мумкин аст... Кубернетес хамчун риэлтор баромад мекунад. Аммо ичоракоронро чй тавр аз ихтилофот бо якдигар нигох доштан мумкин аст? Чӣ мешавад, агар яке аз онҳо, бигӯед, тасмим гирад, ки ҳаммомро барои ним рӯз қарз гирад?

Ин аст сайд. Як контейнери беэҳтиёт метавонад тамоми захираҳои мавҷудаи CPU-ро дар мошин бихӯрад. Агар шумо стеки замимаҳои оқилона дошта бошед (масалан, JVM, Go, Node VM дуруст танзим карда шудаанд), пас ин мушкиле нест: шумо метавонед дар чунин шароит муддати тӯлонӣ кор кунед. Аммо агар барномаҳо суст оптимизатсия шуда бошанд ё умуман оптимизатсия нашуда бошанд (FROM java:latest), вазъият аз назорат баромада метавонад. Дар Omio мо пойгоҳи автоматии Dockerfiles бо танзимоти мувофиқи пешфарз барои стеки асосии забон дорем, бинобар ин ин масъала вуҷуд надошт.

Мо тавсия медиҳем, ки нишондиҳандаҳоро назорат кунед ИСЛОҲОТ (истифода, сершавӣ ва хатогиҳо), таъхирҳои API ва сатҳи хатогиҳо. Боварӣ ҳосил кунед, ки натиҷаҳо ба интизориҳо мувофиқат мекунанд.

мурожиат

Ин ҳикояи мост. Маводҳои зерин барои фаҳмидани воқеа кӯмак карданд:

Ҳисобот оид ба хатогиҳои Kubernetes:

Оё шумо дар таҷрибаи худ бо мушкилоти шабеҳ дучор шудаед ё таҷрибаи марбут ба дроссел дар муҳити истеҳсолии контейнер доштаед? Ҳикояи худро дар шарҳҳо мубодила кунед!

PS аз тарҷумон

Инчунин дар блоги мо хонед:

Манбаъ: will.com

Илова Эзоҳ