Ограничења ЦПУ-а и агресивно пригушивање у Кубернетесу

Белешка. трансл.: Ова фасцинантна историја Омиа — европског агрегатора за путовања — води читаоце од основне теорије до фасцинантних практичних замршености Кубернетес конфигурације. Познавање таквих случајева помаже не само да проширите своје видике, већ и да спречите не-тривијалне проблеме.

Ограничења ЦПУ-а и агресивно пригушивање у Кубернетесу

Да ли вам се икада догодило да се нека апликација заглави, престане да одговара на здравствене прегледе и не можете да схватите зашто? Једно могуће објашњење је везано за ограничења квоте ЦПУ ресурса. О томе ћемо говорити у овом чланку.

ТЛ; ДР:
Препоручујемо вам да онемогућите ЦПУ ограничења у Кубернетес-у (или онемогућите ЦФС квоте у Кубелет-у) ако користите верзију Линук кернела са грешком у ЦФС квоти. У језгру је доступан озбиљан и познат грешка која доводи до прекомерног пригушивања и кашњења
.

У Омију целокупном инфраструктуром управља Кубернетес. Сва наша радна оптерећења са стањем и без стања раде искључиво на Кубернетес-у (користимо Гоогле Кубернетес Енгине). У последњих шест месеци почели смо да примећујемо насумична успоравања. Апликације се замрзавају или престају да реагују на здравствене провере, губе везу са мрежом итд. Овакво понашање нас је дуго збуњивало и коначно смо одлучили да проблем схватимо озбиљно.

Резиме чланка:

  • Неколико речи о контејнерима и Кубернетесу;
  • Како се имплементирају ЦПУ захтеви и ограничења;
  • Како ЦПУ лимит функционише у окружењима са више језгара;
  • Како пратити пригушивање ЦПУ-а;
  • Решење проблема и нијансе.

Неколико речи о контејнерима и Кубернетесу

Кубернетес је у суштини савремени стандард у свету инфраструктуре. Његов главни задатак је оркестрација контејнера.

Контејнери

У прошлости смо морали да креирамо артефакте као што су Јава ЈАР-ови/ВАР-ови, Питхон јаја или извршни фајлови за покретање на серверима. Међутим, да би они функционисали, морао је да се уради додатни посао: инсталирање рунтиме окружења (Јава/Питхон), постављање потребних датотека на права места, обезбеђивање компатибилности са одређеном верзијом оперативног система итд. Другим речима, пажљива пажња је морала да се посвети управљању конфигурацијом (што је често био извор несугласица између програмера и системских администратора).

Контејнери су променили све. Сада је артефакт слика контејнера. Може се представити као нека врста проширене извршне датотеке која садржи не само програм, већ и пуноправно окружење за извршавање (Јава/Питхон/...), као и неопходне датотеке/пакете, унапред инсталиране и спремне за трцати. Контејнери се могу поставити и покренути на различитим серверима без икаквих додатних корака.

Поред тога, контејнери раде у сопственом окружењу сандбок-а. Имају свој виртуелни мрежни адаптер, сопствени систем датотека са ограниченим приступом, сопствену хијерархију процеса, сопствена ограничења на ЦПУ и меморију, итд. Све ово се имплементира захваљујући посебном подсистему језгра Линука - именским просторима.

Кубернетес

Као што је раније речено, Кубернетес је оркестратор контејнера. Функционише овако: дате му скуп машина, а затим кажете: „Хеј, Кубернетес, хајде да покренемо десет инстанци мог контејнера са 2 процесора и по 3 ГБ меморије и наставимо да раде!“ Кубернетес ће се побринути за остало. Пронаћи ће слободан капацитет, покренути контејнере и поново их покренути ако је потребно, покренути ажурирање приликом промене верзија итд. У суштини, Кубернетес вам омогућава да апстрахујете хардверску компоненту и прави широк спектар система погодних за примену и покретање апликација.

Ограничења ЦПУ-а и агресивно пригушивање у Кубернетесу
Кубернетес из угла лаика

Шта су захтеви и ограничења у Кубернетесу

У реду, покрили смо контејнере и Кубернетес. Такође знамо да више контејнера може да се налази на истој машини.

Може се повући аналогија са комуналним станом. Простране просторије (машине/агрегати) се узимају и изнајмљују на више закупаца (контејнера). Кубернетес делује као агент за некретнине. Поставља се питање, како станаре сачувати од међусобних сукоба? Шта ако неко од њих, рецимо, одлучи да позајми купатило на пола дана?

Овде се појављују захтеви и ограничења. Процесори Рекуест потребна искључиво за потребе планирања. Ово је нешто попут „листе жеља“ контејнера и користи се за одабир најпогоднијег чвора. Истовремено ЦПУ Ограничити може се упоредити са уговором о закупу - чим одаберемо јединицу за контејнер, не може превазићи утврђене границе. И ту настаје проблем...

Како се захтеви и ограничења примењују у Кубернетесу

Кубернетес користи механизам за пригушивање (прескакање циклуса такта) уграђен у језгро за имплементацију ЦПУ ограничења. Ако апликација прекорачи ограничење, пригушивање је омогућено (тј. прима мање ЦПУ циклуса). Захтеви и ограничења за меморију су различито организовани, па их је лакше открити. Да бисте то урадили, само проверите статус последњег поновног покретања модула: да ли је „ООМКиллед“. Пригушивање ЦПУ-а није тако једноставно, пошто К8с чини метрику доступним само према употреби, а не по цгрупама.

ЦПУ Рекуест

Ограничења ЦПУ-а и агресивно пригушивање у Кубернетесу
Како се имплементира ЦПУ захтев

Ради једноставности, погледајмо процес користећи машину са 4-језгарним ЦПУ-ом као пример.

К8с користи механизам контролне групе (цгроупс) да контролише алокацију ресурса (меморија и процесор). За то је доступан хијерархијски модел: дете наслеђује границе родитељске групе. Детаљи дистрибуције се чувају у виртуелном систему датотека (/sys/fs/cgroup). У случају процесора, ово је /sys/fs/cgroup/cpu,cpuacct/*.

К8с користи датотеку cpu.share да додели ресурсе процесора. У нашем случају, роот цгроуп добија 4096 удела ЦПУ ресурса – 100% расположиве снаге процесора (1 језгро = 1024; ово је фиксна вредност). Основна група распоређује ресурсе пропорционално у зависности од удела потомака регистрованих у cpu.share, а они, пак, то исто чине са својим потомцима итд. На типичном Кубернетес чвору, основна цгроуп има три детета: system.slice, user.slice и kubepods. Прве две подгрупе се користе за дистрибуцију ресурса између критичних оптерећења система и корисничких програма изван К8с. Последњи - kubepods — креирао Кубернетес за дистрибуцију ресурса између подова.

Горњи дијаграм показује да су прва и друга подгрупа примиле сваку 1024 акције, са додељеном подгрупом куберпод 4096 акције Како је то могуће: на крају крајева, роот група има приступ само 4096 акције, а збир удела њених потомака знатно премашује овај број (6144)? Поента је да вредност има логичан смисао, тако да је Линук планер (ЦФС) користи да пропорционално додељује ЦПУ ресурсе. У нашем случају прве две групе примају 680 реалне акције (16,6% од 4096), а кубепод добија остатак 2736 акције У случају застоја, прве две групе неће користити додељене ресурсе.

Срећом, планер има механизам да избегне трошење неискоришћених ЦПУ ресурса. Он преноси „неактивни“ капацитет у глобални скуп, из којег се дистрибуира групама којима је потребна додатна снага процесора (пренос се дешава у серијама да би се избегли губици заокруживања). Сличан метод се примењује на све потомке потомака.

Овај механизам обезбеђује праведну расподелу процесорске снаге и осигурава да ниједан процес не „краде“ ресурсе од других.

ЦПУ Лимит

Упркос чињеници да конфигурације ограничења и захтева у К8с изгледају слично, њихова имплементација је радикално другачија: највише обмањујуће а најмање документовани део.

К8с се укључује Механизам квота ЦФС да примени ограничења. Њихова подешавања су наведена у датотекама cfs_period_us и cfs_quota_us у директоријуму цгроуп (датотека се такође налази тамо cpu.share).

Супротно cpu.share, квота се заснива на временски период, а не на доступну снагу процесора. cfs_period_us одређује трајање периода (епохе) – увек је 100000 μс (100 мс). Постоји опција за промену ове вредности у К8с, али је за сада доступна само у алфа верзији. Планер користи епоху да поново покрене искоришћене квоте. Други фајл cfs_quota_us, специфицира расположиво време (квоту) у свакој епохи. Имајте на уму да је такође наведено у микросекундама. Квота може премашити дужину епохе; другим речима, може бити веће од 100 мс.

Хајде да погледамо два сценарија на машинама са 16 језгара (најчешћи тип рачунара који имамо у Омиу):

Ограничења ЦПУ-а и агресивно пригушивање у Кубернетесу
Сценарио 1: 2 нити и ограничење од 200 мс. Нема пригушивања

Ограничења ЦПУ-а и агресивно пригушивање у Кубернетесу
Сценарио 2: 10 нити и ограничење од 200 мс. Пригушивање почиње након 20 мс, приступ ресурсима процесора се наставља након још 80 мс

Рецимо да сте поставили ограничење ЦПУ-а на 2 језгра; Кубернетес ће превести ову вредност на 200 мс. То значи да контејнер може да користи највише 200мс ЦПУ времена без пригушења.

И ту почиње забава. Као што је горе поменуто, доступна квота је 200 мс. Ако радите паралелно десет нити на машини са 12 језгара (погледајте илустрацију за сценарио 2), док су сви остали подови у стању мировања, квота ће бити исцрпљена за само 20 мс (пошто 10 * 20 мс = 200 мс), а све нити овог под-а ће висјети » (Гуша) за наредних 80 мс. Већ поменути грешка распореда, због чега долази до прекомерног пригушивања и контејнер не може ни да испуни постојећу квоту.

Како проценити пригушивање у махунама?

Само се пријавите на под и извршите cat /sys/fs/cgroup/cpu/cpu.stat.

  • nr_periods — укупан број периода планирања;
  • nr_throttled — број пригушених периода у композицији nr_periods;
  • throttled_time — кумулативно пригушено време у наносекундама.

Ограничења ЦПУ-а и агресивно пригушивање у Кубернетесу

Шта се стварно дешава?

Као резултат тога, добијамо високо пригушивање у свим апликацијама. Понекад је унутра један и по пут јачи од прорачунатог!

То доводи до разних грешака - неуспеха провере спремности, замрзавања контејнера, прекида мрежне везе, тајм-аута у оквиру позива сервиса. Ово на крају резултира повећањем кашњења и већим стопама грешака.

Одлука и последице

Овде је све једноставно. Напустили смо ЦПУ ограничења и почели да ажурирамо језгро ОС у кластерима на најновију верзију, у којој је грешка исправљена. Број грешака (ХТТП 5кк) у нашим услугама је одмах значајно опао:

ХТТП 5кк грешке

Ограничења ЦПУ-а и агресивно пригушивање у Кубернетесу
ХТТП 5кк грешке за једну критичну услугу

Време одговора п95

Ограничења ЦПУ-а и агресивно пригушивање у Кубернетесу
Кашњење захтева за критичну услугу, 95. перцентил

Оперативни трошкови

Ограничења ЦПУ-а и агресивно пригушивање у Кубернетесу
Број утрошених сати

Шта је улов?

Као што је речено на почетку чланка:

Може се повући аналогија са комуналним станом... Кубернетес се понаша као продавац некретнина. Али како заштитити станаре од међусобних сукоба? Шта ако неко од њих, рецимо, одлучи да позајми купатило на пола дана?

Ево цака. Један немаран контејнер може појести све расположиве ЦПУ ресурсе на машини. Ако имате паметни стек апликација (на пример, ЈВМ, Го, Ноде ВМ су правилно конфигурисани), онда то није проблем: можете радити у таквим условима дуго времена. Али ако су апликације лоше оптимизоване или уопште нису оптимизоване (FROM java:latest), ситуација може измаћи контроли. У Омиу имамо аутоматизоване основне Доцкер фајлове са адекватним подразумеваним подешавањима за главни језички стог, тако да овај проблем није постојао.

Препоручујемо да пратите метрику УПОТРЕБА (коришћење, засићење и грешке), кашњења АПИ-ја и стопе грешака. Уверите се да резултати испуњавају очекивања.

референце

Ово је наша прича. Следећи материјали су у великој мери помогли да се разуме шта се дешава:

Кубернетес извештаји о грешкама:

Да ли сте се сусрели са сличним проблемима у својој пракси или имате искуства у вези са пригушивањем у контејнерским производним окружењима? Поделите своју причу у коментарима!

ПС од преводиоца

Прочитајте и на нашем блогу:

Извор: ввв.хабр.цом

Додај коментар