Limiti tas-CPU u throttling aggressiv f'Kubernetes

Nota. transl.: Din l-istorja li tiftaħ l-għajnejn ta 'Omio—aggregatur Ewropew tal-ivvjaġġar—tieħu lill-qarrejja mit-teorija bażika għall-intricacies prattiċi affaxxinanti tal-konfigurazzjoni ta' Kubernetes. Il-familjarità ma 'każijiet bħal dawn tgħin mhux biss twessa' l-orizzonti tiegħek, iżda wkoll tevita problemi mhux trivjali.

Limiti tas-CPU u throttling aggressiv f'Kubernetes

Qatt kellek applikazzjoni mwaħħla f'postha, tieqaf tirrispondi għall-kontrolli tas-saħħa, u ma tkunx tista' tara għaliex? Spjegazzjoni waħda possibbli hija relatata mal-limiti tal-kwota tar-riżorsi tas-CPU. Dan huwa dak li se nitkellmu dwaru f'dan l-artikolu.

TL; DR:
Nirrakkomandaw bil-qawwa li tiddiżattiva l-limiti tas-CPU f'Kubernetes (jew li tiddiżattiva l-kwoti tas-CFS f'Kubelet) jekk qed tuża verżjoni tal-kernel tal-Linux b'bug tal-kwota CFS. Fil-qalba hemm serji u magħrufa sew bug li jwassal għal throttling eċċessiv u dewmien
.

Fl-Omio l-infrastruttura kollha hija ġestita minn Kubernetes. Il-piżijiet tax-xogħol tagħna b'istat u mingħajr stat jaħdmu esklussivament fuq Kubernetes (nużaw Google Kubernetes Engine). Fl-aħħar sitt xhur, bdejna nosservaw tnaqqis każwali. L-applikazzjonijiet jiffriżaw jew jieqfu jirrispondu għall-kontrolli tas-saħħa, jitilfu l-konnessjoni man-netwerk, eċċ. Din l-imġieba ħarbitna għal żmien twil, u fl-aħħar iddeċidejna li nieħdu l-problema bis-serjetà.

Sommarju tal-artiklu:

  • Ftit kliem dwar kontenituri u Kubernetes;
  • Kif jiġu implimentati t-talbiet u l-limiti tas-CPU;
  • Kif jaħdem il-limitu tas-CPU f'ambjenti multi-core;
  • Kif issegwi t-throttling tas-CPU;
  • Soluzzjoni tal-problema u sfumaturi.

Ftit kelmiet dwar kontenituri u Kubernetes

Kubernetes huwa essenzjalment l-istandard modern fid-dinja tal-infrastruttura. Il-kompitu ewlieni tiegħu huwa l-orkestrazzjoni tal-kontejners.

Kontenituri

Fil-passat, kellna noħolqu artifacts bħal Java JARs/WARs, Python Eggs, jew eżekutibbli biex jaħdmu fuq servers. Madankollu, biex jagħmluhom jiffunzjonaw, kellu jsir xogħol addizzjonali: l-installazzjoni tal-ambjent tar-runtime (Java/Python), it-tqegħid tal-fajls meħtieġa fil-postijiet it-tajba, l-iżgurar tal-kompatibilità ma 'verżjoni speċifika tas-sistema operattiva, eċċ. Fi kliem ieħor, kellha tingħata attenzjoni bir-reqqa lill-ġestjoni tal-konfigurazzjoni (li ħafna drabi kienet sors ta 'tilwim bejn l-iżviluppaturi u l-amministraturi tas-sistema).

Il-kontenituri bidlu kollox. Issa l-artifatt huwa immaġni tal-kontenitur. Jista 'jiġi rappreżentat bħala tip ta' fajl eżekutibbli estiż li fih mhux biss il-programm, iżda wkoll ambjent ta 'eżekuzzjoni sħiħa (Java/Python/...), kif ukoll il-fajls/pakketti meħtieġa, installati minn qabel u lesti biex run. Kontenituri jistgħu jiġu skjerati u mħaddma fuq servers differenti mingħajr ebda passi addizzjonali.

Barra minn hekk, il-kontenituri joperaw fl-ambjent tal-kaxxa tar-ramel tagħhom stess. Għandhom l-adapter tan-netwerk virtwali tagħhom stess, is-sistema tal-fajls tagħhom stess b'aċċess limitat, il-ġerarkija tal-proċessi tagħhom stess, il-limitazzjonijiet tagħhom stess fuq is-CPU u l-memorja, eċċ Dan kollu huwa implimentat grazzi għal sottosistema speċjali tal-kernel Linux - namespaces.

Kubernetes

Kif intqal qabel, Kubernetes huwa orkestratur tal-kontejners. Taħdem hekk: tagħtiha ġabra ta' magni, u mbagħad tgħid: "Ħej, Kubernetes, ejja nniedu għaxar każijiet tal-kontenitur tiegħi b'2 proċessuri u 3 GB ta' memorja kull wieħed, u żommhom jaħdmu!" Kubernetes se jieħu ħsieb il-bqija. Se jsib kapaċità b'xejn, iniedi kontenituri u jerġa 'jibdahom jekk meħtieġ, joħroġ aġġornament meta jbiddel il-verżjonijiet, eċċ. Essenzjalment, Kubernetes jippermettilek tastratta l-komponent tal-ħardwer u tagħmel varjetà wiesgħa ta 'sistemi adattati għall-iskjerament u t-tħaddim ta' applikazzjonijiet.

Limiti tas-CPU u throttling aggressiv f'Kubernetes
Kubernetes mil-lat tal-layman

X'inhuma t-talbiet u l-limiti f'Kubernetes

Tajjeb, koprejna kontenituri u Kubernetes. Nafu wkoll li kontenituri multipli jistgħu joqogħdu fuq l-istess magna.

Tista' ssir analoġija ma' appartament komunali. Fond spazjuż (magni/unitajiet) jittieħed u jinkera lil diversi kerrejja (kontenituri). Kubernetes jaġixxi bħala realtor. Tqum il-mistoqsija, kif iżżomm lill-inkwilini minn kunflitti ma 'xulxin? X'jiġri jekk wieħed minnhom, ngħidu aħna, jiddeċiedi li jissellef il-kamra tal-banju għal nofs il-ġurnata?

Dan huwa fejn jidħlu t-talbiet u l-limiti. CPU Talba meħtieġa biss għal skopijiet ta’ ppjanar. Din hija xi ħaġa bħal "lista ta 'xewqat" tal-kontenitur, u tintuża biex tagħżel l-iktar nodu adattat. Fl-istess ħin is-CPU Limitu jista jitqabbel ma ftehim ta kiri - hekk kif aħna tagħżel unità għall-kontenitur, il ma tistax tmur lil hinn mil-limiti stabbiliti. U hawnhekk tqum il-problema...

Kif it-talbiet u l-limiti huma implimentati f'Kubernetes

Kubernetes juża mekkaniżmu ta 'throttling (taqbeż iċ-ċikli tal-arloġġ) mibni fil-kernel biex jimplimenta l-limiti tas-CPU. Jekk applikazzjoni taqbeż il-limitu, it-throttling huwa attivat (jiġifieri tirċievi inqas ċikli CPU). It-talbiet u l-limiti għall-memorja huma organizzati b'mod differenti, għalhekk huma aktar faċli biex jinstabu. Biex tagħmel dan, iċċekkja biss l-aħħar status tal-bidu mill-ġdid tal-pod: jekk huwiex "OOMKilled". It-throttling tas-CPU mhuwiex daqshekk sempliċi, peress li K8s jagħmel il-metriċi disponibbli biss bl-użu, mhux minn cgroups.

Talba tas-CPU

Limiti tas-CPU u throttling aggressiv f'Kubernetes
Kif tiġi implimentata t-talba tas-CPU

Għas-sempliċità, ejja nħarsu lejn il-proċess billi tuża magna b'CPU b'4-core bħala eżempju.

K8s juża mekkaniżmu ta 'grupp ta' kontroll (cgroups) biex jikkontrolla l-allokazzjoni tar-riżorsi (memorja u proċessur). Mudell ġerarkiku huwa disponibbli għaliha: it-tifel jiret il-limiti tal-grupp ġenitur. Id-dettalji tad-distribuzzjoni huma maħżuna f'sistema ta 'fajls virtwali (/sys/fs/cgroup). Fil-każ ta 'proċessur dan huwa /sys/fs/cgroup/cpu,cpuacct/*.

K8s juża fajl cpu.share biex talloka r-riżorsi tal-proċessur. Fil-każ tagħna, l-għerq cgroup jieħu 4096 sehem tar-riżorsi tas-CPU - 100% tal-qawwa tal-proċessur disponibbli (qalba 1 = 1024; dan huwa valur fiss). Il-grupp tal-għeruq iqassam ir-riżorsi proporzjonalment skont l-ishma tad-dixxendenti rreġistrati fihom cpu.share, u huma, min-naħa tagħhom, jagħmlu l-istess mad-dixxendenti tagħhom, eċċ. Fuq node Kubernetes tipiku, l-għerq cgroup għandu tlett itfal: system.slice, user.slice и kubepods. L-ewwel żewġ sottogruppi jintużaw biex iqassmu riżorsi bejn tagħbijiet kritiċi tas-sistema u programmi tal-utent barra mill-K8s. L-aħħar waħda - kubepods — maħluqa minn Kubernetes biex iqassmu r-riżorsi bejn il-miżwed.

Id-dijagramma t'hawn fuq turi li l-ewwel u t-tieni sottogruppi rċevew kull wieħed 1024 ishma, bis-sottogrupp kuberpod allokat 4096 ishma Kif dan huwa possibbli: wara kollox, il-grupp ta 'l-għeruq għandu aċċess għal biss 4096 ishma, u s-somma tal-ishma tad-dixxendenti tagħha taqbeż b'mod sinifikanti dan in-numru (6144)? Il-punt huwa li l-valur jagħmel sens loġiku, għalhekk l-iskeduler Linux (CFS) jużah biex jalloka proporzjonalment ir-riżorsi tas-CPU. Fil-każ tagħna, l-ewwel żewġ gruppi jirċievu 680 ishma reali (16,6% ta '4096), u kubepod jirċievi l-bqija 2736 ishma F'każ ta' waqfien, l-ewwel żewġ gruppi ma jużawx ir-riżorsi allokati.

Fortunatament, l-iskeder għandu mekkaniżmu biex jevita l-ħela tar-riżorsi tas-CPU mhux użati. Titrasferixxi kapaċità "idle" għal ġabra globali, li minnha titqassam lil gruppi li jeħtieġu qawwa addizzjonali tal-proċessur (it-trasferiment iseħħ f'lottijiet biex jiġi evitat it-telf tal-arrotondament). Metodu simili huwa applikat għad-dixxendenti kollha tad-dixxendenti.

Dan il-mekkaniżmu jiżgura distribuzzjoni ġusta tal-qawwa tal-proċessur u jiżgura li ħadd ma jipproċessa "jisraq" riżorsi minn oħrajn.

Limitu tas-CPU

Minkejja l-fatt li l-konfigurazzjonijiet tal-limiti u t-talbiet fil-K8s jidhru simili, l-implimentazzjoni tagħhom hija radikalment differenti: dan l-aktar qarrieqa u l-inqas parti dokumentata.

K8s jimpenja Mekkaniżmu tal-kwota tas-CFS biex timplimenta limiti. Is-settings tagħhom huma speċifikati fil-fajls cfs_period_us и cfs_quota_us fid-direttorju cgroup (il-fajl jinsab hemm ukoll cpu.share).

B'differenza cpu.share, il-kwota hija bbażata fuq perjodu ta’ żmien, u mhux fuq il-qawwa tal-proċessur disponibbli. cfs_period_us jispeċifika t-tul tal-perjodu (epoch) - huwa dejjem 100000 μs (100 ms). Hemm għażla li jinbidel dan il-valur f'K8s, iżda huwa disponibbli biss f'alpha għalissa. L-iskedar juża l-epoch biex jerġa' jibda l-kwoti użati. It-tieni fajl cfs_quota_us, jispeċifika l-ħin disponibbli (kwota) f'kull epoka. Innota li huwa wkoll speċifikat f'mikrosekondi. Il-kwota tista' taqbeż it-tul tal-epoka; fi kliem ieħor, jista 'jkun akbar minn 100 ms.

Ejja nħarsu lejn żewġ xenarji fuq magni b'16-il qalba (l-aktar tip ta' kompjuter komuni li għandna f'Omio):

Limiti tas-CPU u throttling aggressiv f'Kubernetes
Xenarju 1: 2 ħjut u limitu ta' 200 ms. Ebda throttling

Limiti tas-CPU u throttling aggressiv f'Kubernetes
Xenarju 2: 10 ħjut u limitu ta' 200 ms. It-throttling jibda wara 20 ms, l-aċċess għar-riżorsi tal-proċessur jerġa 'jibda wara 80 ms oħra

Ejja ngħidu li tissettja l-limitu tas-CPU għal 2 qlub; Kubernetes se jittraduċi dan il-valur għal 200 ms. Dan ifisser li l-kontenitur jista 'juża massimu ta' 200ms ta 'ħin CPU mingħajr throttling.

U hawnhekk jibda l-gost. Kif imsemmi hawn fuq, il-kwota disponibbli hija 200 ms. Jekk qed taħdem b'mod parallel għaxra ħjut fuq magna bi 12-il qalba (ara l-illustrazzjoni għax-xenarju 2), filwaqt li l-imżiewed l-oħra kollha jkunu inattivi, il-kwota se tiġi eżawrita f'20 ms biss (peress li 10 * 20 ms = 200 ms), u l-ħjut kollha ta' dan il-pod se jiġu mdendlin » (throttle) għat-80 ms li jmiss. Diġà msemmija bug Scheduler, li minħabba fih iseħħ throttling eċċessiv u l-kontenitur lanqas biss jista' jissodisfa l-kwota eżistenti.

Kif tevalwa t-throttling fil-miżwed?

Idħol biss fil-pod u tesegwixxi cat /sys/fs/cgroup/cpu/cpu.stat.

  • nr_periods — in-numru totali ta' perjodi ta' skedar;
  • nr_throttled — numru ta' perjodi throttled fil-kompożizzjoni nr_periods;
  • throttled_time — ħin throttled kumulattiv f'nanosekondi.

Limiti tas-CPU u throttling aggressiv f'Kubernetes

X'qed jiġri verament?

Bħala riżultat, ikollna throttling għoli fl-applikazzjonijiet kollha. Kultant ikun fih darba u nofs aktar b'saħħtu milli kkalkulat!

Dan iwassal għal diversi żbalji - fallimenti fil-verifika tal-prontezza, iffriżar tal-kontenituri, waqfiet fil-konnessjoni tan-netwerk, timeouts fi ħdan is-sejħiet tas-servizz. Dan fl-aħħar mill-aħħar jirriżulta f'latenza akbar u rati ogħla ta 'żbalji.

Deċiżjoni u konsegwenzi

Kollox huwa sempliċi hawn. Abbandunajna l-limiti tas-CPU u bdejna naġġornaw il-kernel tal-OS fi gruppi għall-aħħar verżjoni, li fiha l-bug ġie ffissat. In-numru ta' żbalji (HTTP 5xx) fis-servizzi tagħna immedjatament naqas b'mod sinifikanti:

Żbalji HTTP 5xx

Limiti tas-CPU u throttling aggressiv f'Kubernetes
Żbalji HTTP 5xx għal servizz kritiku wieħed

Ħin ta’ rispons p95

Limiti tas-CPU u throttling aggressiv f'Kubernetes
Latenza ta' talba għal servizz kritiku, 95 perċentil

Spejjeż operattivi

Limiti tas-CPU u throttling aggressiv f'Kubernetes
Numru ta' sigħat ta' istanza mqattgħin

X'inhi l-qabda?

Kif intqal fil-bidu tal-artiklu:

Tista' ssir analoġija ma' appartament komunali... Kubernetes jaġixxi bħala realtor. Imma kif iżżomm lill-inkwilini minn kunflitti ma’ xulxin? X'jiġri jekk wieħed minnhom, ngħidu aħna, jiddeċiedi li jissellef il-kamra tal-banju għal nofs il-ġurnata?

Hawn il-qabda. Kontenitur wieħed traskurat jista 'jiekol ir-riżorsi kollha disponibbli tas-CPU fuq magna. Jekk għandek munzell ta 'applikazzjoni intelliġenti (per eżempju, JVM, Go, Node VM huma kkonfigurati sew), allura din mhix problema: tista' taħdem f'kundizzjonijiet bħal dawn għal żmien twil. Imma jekk l-applikazzjonijiet huma ottimizzati ħażin jew ma ottimizzati xejn (FROM java:latest), is-sitwazzjoni tista 'toħroġ mill-kontroll. F'Omio għandna Dockerfiles bażi awtomatizzati b'settings default adegwati għall-munzell maġġuri tal-lingwa, għalhekk din il-kwistjoni ma kinitx teżisti.

Nirrakkomandaw li timmonitorja l-metriċi UŻU (użu, saturazzjoni u żbalji), dewmien API u rati ta 'żbalji. Żgura li r-riżultati jilħqu l-aspettattivi.

referenzi

Din hija l-istorja tagħna. Il-materjali li ġejjin għenu ħafna biex wieħed jifhem dak li kien qed jiġri:

Rapporti tal-bug tal-Kubernetes:

Iltqajt ma' problemi simili fil-prattika tiegħek jew għandek esperjenza relatata mat-throttling f'ambjenti ta' produzzjoni fil-kontejners? Aqsam l-istorja tiegħek fil-kummenti!

PS minn traduttur

Aqra wkoll fuq il-blog tagħna:

Sors: www.habr.com

Żid kumment