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.
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.
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
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):
Xenarju 1: 2 ħjut u limitu ta' 200 ms. Ebda throttling
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.
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
Żbalji HTTP 5xx għal servizz kritiku wieħed
Ħin ta’ rispons p95
Latenza ta' talba għal servizz kritiku, 95 perċentil
Spejjeż operattivi
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:
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!