Limit CPU ak throttling agresif nan Kubernetes

Remak. trad.: Istwa sa a ki ouvè je nan Omio—yon agrégateur vwayaj Ewopeyen an—pran lektè yo soti nan teyori debaz yo nan konplikasyon yo kaptivan pratik nan konfigirasyon Kubernetes. Abitye ak ka sa yo ede non sèlman elaji orizon ou, men tou, anpeche pwoblèm ki pa trivial.

Limit CPU ak throttling agresif nan Kubernetes

Èske w te janm gen yon aplikasyon ki bloke an plas, sispann reponn a chèk sante, epi ou pa kapab konnen poukisa? Yon eksplikasyon posib ki gen rapò ak limit kota resous CPU yo. Sa a se sa nou pral pale sou nan atik sa a.

TL; DR:
Nou rekòmande pou enfim limit CPU nan Kubernetes (oswa enfim kota CFS nan Kubelet) si w ap itilize yon vèsyon nwayo Linux ak yon ensèk kota CFS. Nan nwayo a disponib grav ak byen li te ye yon ensèk ki mennen nan throttling twòp ak reta
.

Nan Omio se tout enfrastrikti a jere pa Kubernetes. Tout chaj travay ak eta ak apatrid nou yo kouri sèlman sou Kubernetes (nou itilize Google Kubernetes Engine). Nan sis dènye mwa yo, nou te kòmanse obsève ralantisman o aza. Aplikasyon yo bloke oswa sispann reponn a chèk sante, pèdi koneksyon ak rezo a, elatriye. Konpòtman sa a te twouble nou pou yon tan long, epi finalman nou te deside pran pwoblèm nan oserye.

Rezime atik la:

  • Yon kèk mo sou resipyan ak Kubernetes;
  • Ki jan CPU demann ak limit yo aplike;
  • Ki jan CPU limit travay nan anviwònman milti-nwayo;
  • Ki jan yo swiv CPU throttling;
  • Solisyon pwoblèm ak nuans.

Kèk mo sou resipyan ak Kubernetes

Kubernetes se esansyèlman estanda modèn nan mond enfrastrikti. Travay prensipal li se òkestrasyon veso.

Resipyan

Nan tan lontan, nou te oblije kreye zafè tankou Java JARs/WARs, Python Eggs, oswa ègzèkutabl yo kouri sou sèvè. Sepandan, pou fè yo fonksyone, travay adisyonèl yo te dwe fè: enstale anviwònman an ègzekutabl (Java / Python), mete dosye ki nesesè yo nan bon kote, asire konpatibilite ak yon vèsyon espesifik nan sistèm nan fonksyone, elatriye. Nan lòt mo, atansyon yo te dwe peye jesyon konfigirasyon (ki te souvan yon sous diskisyon ant devlopè ak administratè sistèm).

Kontenè yo chanje tout bagay. Koulye a, zafè a se yon imaj veso. Li ka reprezante kòm yon kalite dosye ègzèkutabl pwolonje ki gen non sèlman pwogram nan, men tou, yon anviwònman ekzekisyon plen véritable (Java/Python/...), osi byen ke dosye ki nesesè yo / pakè, pre-enstale ak pare yo. kouri. Kontenè yo ka deplwaye epi kouri sou diferan serveurs san okenn etap adisyonèl.

Anplis de sa, veso yo opere nan pwòp anviwònman sandbox yo. Yo gen pwòp adaptè rezo vityèl yo, pwòp sistèm dosye yo ak aksè limite, yerachi pwòp yo nan pwosesis, pwòp limit yo sou CPU ak memwa, elatriye. Tout bagay sa a se aplike gras a yon subsistèm espesyal nan nwayo a Linux - namespaces.

Kubernetes

Jan sa di pi bonè, Kubernetes se yon orchestrator veso. Li travay tankou sa a: ou ba li yon pisin nan machin, epi Lè sa a, di: "Hey, Kubernetes, ann lanse dis egzanp veso mwen an ak 2 processeur ak 3 GB memwa chak, epi kenbe yo kouri!" Kubernetes pral pran swen rès la. Li pral jwenn kapasite gratis, lanse veso ak rekòmanse yo si sa nesesè, woule mizajou lè chanje vèsyon, elatriye. Esansyèlman, Kubernetes pèmèt ou abstrè eleman pyès ki nan konpitè epi fè yon gran varyete sistèm apwopriye pou deplwaye ak kouri aplikasyon yo.

Limit CPU ak throttling agresif nan Kubernetes
Kubernetes soti nan pwen de vi pwofàn la

Ki sa ki demann ak limit nan Kubernetes

Oke, nou te kouvri kontenè ak Kubernetes. Nou konnen tou ke plizyè resipyan ka abite sou menm machin nan.

Yon analoji ka trase ak yon apatman kominal. Yo pran yon lokal ki laj (machin/inite) epi lwe a plizyè lokatè (resipyan). Kubernetes aji kòm yon riltor. Kesyon an rive, ki jan yo kenbe lokatè soti nan konfli youn ak lòt? E si youn nan yo, di, deside prete twalèt la pou mwatye jounen an?

Sa a se kote demann ak limit antre nan jwèt. CPU Mande nesesè sèlman pou rezon planifikasyon. Sa a se yon bagay tankou yon "lis vle" nan veso a, epi li se itilize yo chwazi ne ki pi apwopriye. An menm tan CPU a Limite ka konpare ak yon akò lokasyon - le pli vit ke nou chwazi yon inite pou veso a, la pa kapab ale pi lwen pase limit etabli yo. Epi se kote pwoblèm nan rive...

Ki jan demann ak limit yo aplike nan Kubernetes

Kubernetes sèvi ak yon mekanis throttling (sote sik revèy) bati nan nwayo a pou aplike limit CPU. Si yon aplikasyon depase limit la, throttling pèmèt (sa vle di li resevwa mwens sik CPU). Demann ak limit pou memwa yo òganize yon fason diferan, kidonk yo pi fasil pou detekte. Pou fè sa, jis tcheke dènye estati rekòmanse gous la: si li se "OOMKilled". CPU throttling pa tèlman senp, paske K8s sèlman fè mezi ki disponib pa itilizasyon, pa pa cgroups.

Demann CPU

Limit CPU ak throttling agresif nan Kubernetes
Ki jan CPU demann yo aplike

Pou senplisite, ann gade nan pwosesis la lè l sèvi avèk yon machin ak yon CPU 4-debaz kòm yon egzanp.

K8s itilize yon mekanis gwoup kontwòl (cgroups) pou kontwole alokasyon resous (memwa ak processeur). Yon modèl yerarchize disponib pou li: timoun nan eritye limit gwoup paran an. Detay distribisyon yo estoke nan yon sistèm dosye vityèl (/sys/fs/cgroup). Nan ka a nan yon processeur sa a se /sys/fs/cgroup/cpu,cpuacct/*.

K8s sèvi ak dosye cpu.share pou asiyen resous processeur. Nan ka nou an, rasin cgroup la jwenn 4096 pataje resous CPU - 100% pouvwa processeur ki disponib (1 nwayo = 1024; sa a se yon valè fiks). Gwoup rasin lan distribye resous yo pwopòsyonèlman depann sou aksyon desandan ki anrejistre yo cpu.share, epi yo, nan vire, fè menm bagay la ak desandan yo, elatriye. Sou yon ne Kubernetes tipik, rasin cgroup la gen twa timoun: system.slice, user.slice и kubepods. Yo itilize de premye gwoup yo pou distribye resous ant chaj sistèm kritik yo ak pwogram itilizatè andeyò K8 yo. Denye - kubepods — Kubernetes te kreye pou distribye resous ant gous yo.

Dyagram ki anwo a montre premye ak dezyèm sougwoup yo te resevwa chak 1024 aksyon, ak sougwoup kuberpod atribye ba yo 4096 aksyon Ki jan sa posib: apre tout, gwoup rasin lan gen aksè a sèlman 4096 aksyon, ak sòm aksyon desandan li yo depase kantite sa a (6144)? Pwen an se ke valè a fè sans ki lojik, kidonk Linux orè (CFS) sèvi ak li pwopòsyonèlman asiyen resous CPU. Nan ka nou an, de premye gwoup yo resevwa 680 aksyon reyèl (16,6% nan 4096), ak kubepod resevwa rès la 2736 aksyon Nan ka D ', de premye gwoup yo pa pral sèvi ak resous yo atribye ba yo.

Erezman, pwogramè a gen yon mekanis pou evite gaspiye resous CPU ki pa itilize yo. Li transfere kapasite "san fè anyen konsa" nan yon pisin mondyal, ki soti nan ki distribye li bay gwoup ki bezwen plis pouvwa processeur (transfè a fèt an pakèt pou evite pèt awondi). Yon metòd menm jan an aplike a tout desandan desandan.

Mekanis sa a asire yon distribisyon jis nan pouvwa processeur ak asire ke pa gen okenn pwosesis "vòlè" resous nan men lòt moun.

Limit CPU

Malgre lefèt ke konfigirasyon limit ak demann nan K8 yo sanble, aplikasyon yo se radikalman diferan: sa a. pi twonpe ak pati ki pi piti dokimante a.

K8s angaje CFS mekanis kota pou aplike limit. Anviwònman yo espesifye nan dosye yo cfs_period_us и cfs_quota_us nan anyè a cgroup (fichye a tou sitiye la cpu.share).

Kontrèman ak cpu.share, kota a baze sou peryòd tan, epi yo pa sou pouvwa a processeur ki disponib. cfs_period_us presize dire peryòd la (epòk) - li toujou 100000 μs (100 ms). Gen yon opsyon pou chanje valè sa a nan K8s, men li disponib sèlman nan alpha pou kounye a. Planifikatè a sèvi ak epòk la pou rekòmanse kota yo itilize yo. Dezyèm dosye cfs_quota_us, presize tan ki disponib (kota) nan chak epòk. Remake byen ke li espesifye tou nan mikrosgond. Kota a ka depase longè epòk la; an lòt mo, li ka pi gran pase 100 ms.

Ann gade de senaryo sou machin 16 nwayo (tip de òdinatè ki pi komen nou genyen nan Omio):

Limit CPU ak throttling agresif nan Kubernetes
Senaryo 1: 2 fil ak yon limit 200 ms. Pa gen throttling

Limit CPU ak throttling agresif nan Kubernetes
Senaryo 2: 10 fil ak limit 200 ms. Throttling kòmanse apre 20 ms, aksè a resous processeur rekòmanse apre yon lòt 80 ms

Ann di ou mete limit CPU a 2 nwayo; Kubernetes pral tradui valè sa a nan 200 ms. Sa vle di ke veso a ka itilize yon maksimòm de 200ms nan tan CPU san yo pa throttling.

Lè sa a se kote plezi a kòmanse. Kòm mansyone pi wo a, kota ki disponib se 200 ms. Si w ap travay nan paralèl dis fil sou yon machin 12-nwayo (gade ilistrasyon pou senaryo 2), pandan tout lòt gous yo san fè anyen konsa, kota a pral fin itilize nan jis 20 ms (depi 10 * 20 ms = 200 ms), epi tout fil gous sa a pral pann. » (Acct) pou pwochen 80 ms. La deja mansyone ensèk pwogramè, akòz ki twòp throttling rive ak veso a pa ka menm ranpli kota ki egziste deja.

Ki jan yo evalye throttling nan gous?

Jis konekte nan gous la epi egzekite cat /sys/fs/cgroup/cpu/cpu.stat.

  • nr_periods — kantite total peryòd pwogramè yo;
  • nr_throttled - kantite peryòd throttled nan konpozisyon an nr_periods;
  • throttled_time - tan kimilatif throttled nan nanosegond.

Limit CPU ak throttling agresif nan Kubernetes

Kisa k ap pase vre?

Kòm yon rezilta, nou jwenn gwo throttling nan tout aplikasyon yo. Pafwa li nan yon fwa ak yon mwatye pi fò pase kalkile!

Sa a mennen nan erè divès kalite - echèk chèk preparasyon pou, veso jele, kraze koneksyon rezo, timeouts nan apèl sèvis yo. Sa a finalman rezilta nan ogmante latansi ak pi gwo pousantaj erè.

Desizyon ak konsekans

Tout bagay se senp isit la. Nou te abandone limit CPU yo epi nou te kòmanse mete ajou nwayo OS la an grap nan dènye vèsyon an, kote ensèk la te fikse. Kantite erè (HTTP 5xx) nan sèvis nou yo imedyatman diminye anpil:

Erè HTTP 5xx

Limit CPU ak throttling agresif nan Kubernetes
Erè HTTP 5xx pou yon sèvis enpòtan

Tan repons p95

Limit CPU ak throttling agresif nan Kubernetes
Latansyon demann kritik sèvis, 95yèm percentile

Depans fonksyònman

Limit CPU ak throttling agresif nan Kubernetes
Kantite èdtan egzanp pase

Ki sa ki se trape an?

Jan sa di nan kòmansman atik la:

Yon analoji ka trase ak yon apatman kominal... Kubernetes aji kòm yon riltor. Men, ki jan yo kenbe lokatè soti nan konfli youn ak lòt? E si youn nan yo, di, deside prete twalèt la pou mwatye jounen an?

Men trape an. Yon veso neglijan ka manje tout resous CPU ki disponib sou yon machin. Si ou gen yon pil aplikasyon entelijan (pa egzanp, JVM, Go, Node VM yo byen configuré), Lè sa a, sa a se pa yon pwoblèm: ou ka travay nan kondisyon sa yo pou yon tan long. Men, si aplikasyon yo mal optimize oswa yo pa optimize ditou (FROM java:latest), sitiyasyon an ka soti nan kontwòl. Nan Omio nou gen Dockerfiles baz otomatik ki gen bon jan paramèt default pou pile lang prensipal la, kidonk pwoblèm sa a pa t egziste.

Nou rekòmande pou kontwole mezi yo SÈVI AK (itilizasyon, saturation ak erè), reta API ak pousantaj erè. Asire ke rezilta yo satisfè atant.

Referans

Sa a se istwa nou an. Materyèl sa yo te ede anpil konprann sa ki t ap pase:

Rapò ensèk Kubernetes:

Èske w te rankontre pwoblèm ki sanble nan pratik ou oswa ou gen eksperyans ki gen rapò ak throttling nan anviwònman pwodiksyon kontenè? Pataje istwa ou nan kòmantè yo!

PS soti nan tradiktè

Li tou sou blog nou an:

Sous: www.habr.com

Add nouvo kòmantè