Kubernetes: Beschleunegt Är Servicer andeems Dir CPU Limiten ewechhuelt

Zréck an 2016 mir um Buffer op Kubernetes gewiesselt, an elo schaffen ongeféier 60 Noden (op AWS) an 1500 Container un eisem k8s Cluster geréiert vum kops. Wéi och ëmmer, mir sinn op Mikroservicer duerch Versuch a Feeler geplënnert, an och no e puer Joer mat k8s schaffen mir nach ëmmer mat neie Probleemer. An dësem Post wäerte mir iwwer schwätzen Prozessor Aschränkungen: firwat mir geduecht hunn datt se gutt Praxis wieren a firwat se um Enn net sou gutt waren.

Prozessor Aschränkungen an Drossel

Wéi vill aner Kubernetes Benotzer, Google recommandéiert héich CPU Limiten ze setzen. Ouni sou eng Astellung kënnen Container an engem Node all Prozessorkraaft ophuelen, wat dann och wichteg Kubernetes Prozesser verursaacht (zum Beispill kubelet) wäert op Ufroe äntweren. Also, CPU Limiten setzen ass e gudde Wee fir Är Noden ze schützen.

Prozessor Grenzen setzen e Container op déi maximal CPU Zäit déi se fir eng spezifesch Period benotze kann (Standard ass 100ms), an de Container wäert dës Limit ni iwwerschreiden. An Kubernetes fir drosselen Container a verhënneren datt et d'Limite iwwerschreit, gëtt e speziellen Tool benotzt CFS Quote, awer dës kënschtlech CPU Limiten schlussendlech d'Performance verletzen an d'Äntwertzäit vun Äre Container erhéijen.

Wat ka geschéien wa mir keng Prozessor Limite setzen?

Leider hu mir dee Problem selwer misste stellen. All Node huet e Prozess verantwortlech fir d'Gestioun vu Container kubelet, an hien huet opgehalen op Ufroen ze reagéieren. Den Node, wann dëst geschitt, wäert an de Staat goen NotReady, a Behälter dovun ginn iergendwou anzwousch ëmgeleet an déiselwecht Probleemer op neie Wirbelen erstellen. Net en idealen Szenario, fir d'mannst ze soen.

Manifestatioun vum Problem vun Drossel an Äntwert

De Schlëssel Metrik fir Container Tracking ass trottling, et weist wéi oft Äre Container gedrosselt gouf. Mir hu mat Interessi d'Präsenz vun Drossel an e puer Container gemierkt, egal ob d'Prozessorbelaaschtung extrem war oder net. Als Beispill kucke mer ee vun eisen Haapt APIen:

Kubernetes: Beschleunegt Är Servicer andeems Dir CPU Limiten ewechhuelt

Wéi Dir hei ënnen gesitt, hu mir d'Limite gesat 800m (0.8 oder 80% Kär), a Spëtzwäerter am beschten erreechen 200m (20% Kär). Et géif schéngen datt ier mir de Service drosselen, mir nach ëmmer vill Prozessorkraaft hunn, awer ...

Kubernetes: Beschleunegt Är Servicer andeems Dir CPU Limiten ewechhuelt
Dir hutt vläicht gemierkt datt och wann d'Prozessorbelaaschtung ënner de spezifizéierte Grenzen ass - wesentlech ënner - Drossel ëmmer nach geschitt.

Konfrontéiert mat dësem hu mir séier verschidde Ressourcen entdeckt (Problem op github, Presentatioun op zadano, posten op omio) iwwer de Réckgang vun der Leeschtung an der Äntwertzäit vu Servicer wéinst Drossel.

Firwat gesi mir Drossel bei gerénger CPU Belaaschtung? Déi kuerz Versioun ass: "et gëtt e Feeler am Linux Kernel deen onnéideg Drossel vu Container mat spezifizéierte Prozessorlimiten verursaacht." Wann Dir un der Natur vum Problem interesséiert sidd, kënnt Dir d'Presentatioun liesen (видео и Text Optiounen) vum Dave Chiluk.

CPU Restriktiounen erofhuelen (mat extremer Vorsicht)

No laangen Diskussiounen hu mir décidéiert Prozessor Restriktiounen vun all Servicer ze läschen, déi direkt oder indirekt kritesch Funktionalitéit fir eis Benotzer beaflosst.

D'Entscheedung war net einfach, well mir d'Stabilitéit vun eisem Cluster héich schätzen. An der Vergaangenheet hu mir schonn experimentéiert mat der Onstabilitéit vun eisem Cluster, an dann hunn d'Servicer ze vill Ressourcen verbraucht an d'Aarbecht vun hirem ganzen Node verlangsamt. Elo war alles e bëssen anescht: mir haten e kloert Verständnis vun deem wat mir vun eise Cluster erwaart hunn, wéi och eng gutt Strategie fir déi geplangten Ännerungen ëmzesetzen.

Kubernetes: Beschleunegt Är Servicer andeems Dir CPU Limiten ewechhuelt
Geschäftskorrespondenz zu engem dréngenden Thema.

Wéi schützt Dir Är Noden wann Restriktiounen opgehuewe ginn?

Isolatioun vun "onbeschränkten" Servicer:

An der Vergaangenheet hu mir schonn e puer Node gesinn an e Staat kommen notReady, virun allem wéinst Servicer déi ze vill Ressourcen verbraucht hunn.

Mir hu beschloss esou Servicer an getrennten ("labeléierten") Noden ze placéieren sou datt se net mat "verbonne" Servicer stéieren. Als Resultat, andeems mir e puer Wirbelen markéieren an den Toleranzparameter op "net verbonnen" Servicer bäidroen, hu mir méi Kontroll iwwer de Stärekoup erreecht, an et gouf méi einfach fir eis Probleemer mat Noden z'identifizéieren. Fir selwer ähnlech Prozesser auszeféieren, kënnt Dir Iech vertraut maachen Dokumentatioun.

Kubernetes: Beschleunegt Är Servicer andeems Dir CPU Limiten ewechhuelt

Eng korrekt Prozessor an Erënnerung Ufro unzeweisen:

Eis gréisste Angscht war datt de Prozess ze vill Ressourcen géif verbrauchen an den Node op Ufroe géif ophalen. Zënter elo (dank dem Datadog) kënne mir all d'Servicer op eisem Stärekoup kloer iwwerwaachen, hunn ech e puer Méint vun der Operatioun vun deenen analyséiert, déi mir als "net verbonne" geplangt hunn. Ech setzen einfach déi maximal CPU Notzung mat engem Spillraum vun 20%, an domat Plaz am Node zougewisen am Fall k8s probéiert aner Servicer un der Node ze zouzeschreiwen.

Kubernetes: Beschleunegt Är Servicer andeems Dir CPU Limiten ewechhuelt

Wéi Dir an der Grafik gesitt, ass déi maximal Belaaschtung op de Prozessor erreecht 242m CPU Cores (0.242 Prozessor Cores). Fir eng Prozessor Ufro ass et genuch fir eng Zuel liicht méi grouss wéi dëse Wäert ze huelen. Notéiert w.e.g. datt well d'Servicer Benotzerzentral sinn, Peakbelaaschtungswäerter mam Traffic zesummefalen.

Maacht datselwecht mat Erënnerungsverbrauch an Ufroen, a voila - Dir sidd alles ageriicht! Fir méi Sécherheet kënnt Dir horizontal Pod Autoscaling addéieren. Also, all Kéier wann d'Ressourcebelaaschtung héich ass, wäert d'Autoscaling nei Pods erstellen, a kubernetes verdeelen se op Noden mat fräiem Raum. Am Fall wou et keng Plaz am Stärekoup selwer ass, kënnt Dir Iech selwer eng Alarm setzen oder d'Additioun vun neie Wirbelen duerch hir Autoskaléierung konfiguréieren.

Vun de Minusen ass et derwäert ze notéieren datt mir verluer hunn an "Container Dicht", d.h. Zuel vu Container déi op engem Node lafen. Mir kënnen och vill "Entspanung" bei niddereg Verkéier Dicht hunn, an et ass och eng Chance, datt Dir eng héich Prozessor Laascht erreechen wäert, mee autoscaling Wirbelen soll mat der leschter hëllefen.

Resultater

Ech si frou dës exzellent Resultater vun Experimenter an de leschte Wochen ze verëffentlechen; Mir hu scho bedeitend Verbesserunge gesinn als Äntwert iwwer all modifizéiert Servicer:

Kubernetes: Beschleunegt Är Servicer andeems Dir CPU Limiten ewechhuelt

Mir hunn déi bescht Resultater op eiser Homepage erreecht (buffer.com), do ass de Service beschleunegt zwee an zwanzeg mol!

Kubernetes: Beschleunegt Är Servicer andeems Dir CPU Limiten ewechhuelt

Ass de Linux Kernel Bug fixéiert?

Jo, De Fehler ass scho fixéiert an d'Fixatioun ass an de Kernel bäigefüügt Distributiounen Versioun 4.19 a méi héich.

Wéi och ëmmer, beim Liesen kubernetes Problemer op github fir den zweeten September 2020 mir kommen nach ëmmer op Ernimmungen vun e puer Linux Projete mat engem ähnleche Feeler. Ech gleewen datt e puer Linux Verdeelungen nach ëmmer dëse Feeler hunn a schaffen just drun ze fixéieren.

Wann Är Verdeelungsversioun manner wéi 4.19 ass, géif ech recommandéieren op déi lescht ze aktualiséieren, awer op alle Fall sollt Dir probéieren d'Prozessorbeschränkungen ze läschen a kucken ob d'Drossel bestoe bleift. Hei ënnen kënnt Dir eng deelweis Lëscht vu Kubernetes Management Servicer a Linux Verdeelungen gesinn:

  • Debian: fix integréiert an déi lescht Versioun vun der Verdeelung, Buster, a gesäit ganz frësch aus (August 2020). E puer fréier Versioune kënnen och fixéiert ginn.
  • Ubuntu: fix integréiert an déi lescht Versioun Ubuntu Focal Fossa 20.04
  • EKS huet nach eng Fix am Dezember 2019. Wann Är Versioun méi niddereg ass wéi dëst, sollt Dir den AMI aktualiséieren.
  • kops: Vun Juni 2020 un у kops 1.18+ Den Haapthostbild wäert Ubuntu 20.04 sinn. Wann Är Versioun vu Kops méi al ass, musst Dir vläicht op eng Fix waarden. Mir selwer waarden elo.
  • GKE (Google Cloud): Fix integréiert Januar 2020, awer et gi Probleemer mat Drossel ginn nach observéiert.

Wat maache wann de Fix de Drosselproblem fixéiert huet?

Ech net sécher op de Problem komplett geléist ass. Wa mir op d'Kernelversioun mat der Fix kommen, testen ech de Cluster an aktualiséieren de Post. Wann iergendeen schon aktualiséiert huet, wier ech interesséiert Är Resultater ze liesen.

Konklusioun

  • Wann Dir mat Docker Container ënner Linux schafft (egal Kubernetes, Mesos, Swarm oder anerer), kënnen Är Container d'Performance verléieren wéinst Drossel;
  • Probéiert op déi lescht Versioun vun Ärer Verdeelung ze aktualiséieren an der Hoffnung datt de Feeler scho fixéiert gouf;
  • Ewechzehuelen Prozessor Limite wäert de Problem léisen, mä dëst ass eng geféierlech Technik, déi mat extremer Vorsicht benotzt ginn soll (et ass besser éischt de Kärel ze update an d'Resultater vergläichen);
  • Wann Dir CPU Grenzen geläscht hutt, iwwerwaacht Är CPU an Erënnerungsverbrauch virsiichteg a gitt sécher datt Är CPU Ressourcen Äre Konsum iwwerschreiden;
  • Eng sécher Optioun wier Pods autoskaléieren fir nei Pods am Fall vun héijer Hardwarebelaaschtung ze kreéieren, sou datt kubernetes se fräi Noden zouginn.

Ech hoffen dëse Post hëlleft Iech d'Performance vun Äre Containersystemer ze verbesseren.

PS et ass den Auteur entsprécht de Lieser a Kommentatoren (op Englesch).


Source: will.com

Setzt e Commentaire