Kubernetes: Ongeza kasi ya huduma zako kwa kuondoa mipaka ya CPU

Huko nyuma mnamo 2016 tuko Buffer imebadilishwa hadi Kubernetes, na sasa takriban nodi 60 (kwenye AWS) na kontena 1500 zinafanya kazi kwenye nguzo yetu ya k8s inayosimamiwa na teke. Hata hivyo, tulihamia huduma ndogo kupitia majaribio na makosa, na hata baada ya miaka kadhaa ya kufanya kazi na k8s bado tunakabiliwa na matatizo mapya. Katika chapisho hili tutazungumzia mapungufu ya processor: kwa nini tulifikiri walikuwa na mazoezi mazuri na kwa nini waliishia kutokuwa wazuri sana.

Mapungufu ya processor na kusukuma

Kama watumiaji wengine wengi wa Kubernetes, Google inapendekeza sana kuweka vikomo vya CPU. Bila mpangilio kama huo, vyombo kwenye nodi vinaweza kuchukua nguvu zote za processor, ambayo husababisha michakato muhimu ya Kubernetes (kwa mfano. kubelet) itaacha kujibu maombi. Kwa hivyo, kuweka mipaka ya CPU ni njia nzuri ya kulinda nodi zako.

Vikomo vya kichakataji huweka kontena hadi upeo wa juu wa muda wa CPU unaoweza kutumia kwa muda maalum (chaguo-msingi ni milisekunde 100), na chombo hakitawahi kuzidi kikomo hiki. Katika Kubernetes kwa kuteleza chombo na kuizuia kuzidi kikomo, chombo maalum hutumiwa Kiasi cha CFS, lakini vikomo hivi bandia vya CPU huishia kudhuru utendaji na kuongeza muda wa majibu wa vyombo vyako.

Je, nini kinaweza kutokea ikiwa hatutaweka vikomo vya kichakataji?

Kwa bahati mbaya, sisi wenyewe tulilazimika kukabiliana na shida hii. Kila nodi ina mchakato unaohusika na udhibiti wa vyombo kubelet, na akaacha kujibu maombi. Node, wakati hii itatokea, itaingia kwenye hali NotReady, na vyombo kutoka kwake vitaelekezwa mahali pengine na kuunda shida sawa kwenye nodi mpya. Si scenario bora, kusema kidogo.

Udhihirisho wa shida ya kuteleza na kujibu

Kipimo muhimu cha ufuatiliaji wa kontena ni trottling, inaonyesha ni mara ngapi kontena yako imebanwa. Tuligundua kwa shauku uwepo wa msongamano katika baadhi ya vyombo, bila kujali kama mzigo wa kichakataji ulikuwa umekithiri au la. Kama mfano, hebu tuangalie mojawapo ya API zetu kuu:

Kubernetes: Ongeza kasi ya huduma zako kwa kuondoa mipaka ya CPU

Kama unavyoona hapa chini, tumeweka kikomo 800m (0.8 au 80% ya msingi), na maadili ya kilele katika ufikiaji bora 200m (20% ya msingi). Inaweza kuonekana kuwa kabla ya kusukuma huduma bado tuna nguvu nyingi za processor, hata hivyo...

Kubernetes: Ongeza kasi ya huduma zako kwa kuondoa mipaka ya CPU
Huenda umeona kwamba hata wakati mzigo wa processor ni chini ya mipaka maalum - kwa kiasi kikubwa chini - throttling bado hutokea.

Kukabiliwa na hii, hivi karibuni tuligundua rasilimali kadhaa (shida kwenye github, uwasilishaji kwenye zadano, chapisha kwenye omio) kuhusu kushuka kwa utendakazi na wakati wa kujibu wa huduma kwa sababu ya kutetemeka.

Kwa nini tunaona kushuka kwa mzigo wa chini wa CPU? Toleo fupi ni: "kuna mdudu kwenye kernel ya Linux ambayo husababisha kusukuma kwa vyombo vilivyo na mipaka maalum ya kichakataji." Ikiwa una nia ya asili ya tatizo, unaweza kusoma uwasilishaji (video ΠΈ maandishi chaguzi) na Dave Chiluk.

Kuondoa vizuizi vya CPU (kwa tahadhari kali)

Baada ya majadiliano marefu, tuliamua kuondoa vikwazo vya kichakataji kutoka kwa huduma zote ambazo ziliathiri moja kwa moja au kwa njia isiyo ya moja kwa moja utendakazi muhimu kwa watumiaji wetu.

Uamuzi haukuwa rahisi kwa sababu tunathamini sana uthabiti wa nguzo yetu. Katika siku za nyuma, tayari tumejaribu kukosekana kwa utulivu wa kikundi chetu, na kisha huduma zilitumia rasilimali nyingi na kupunguza kasi ya kazi ya node yao yote. Sasa kila kitu kilikuwa tofauti kwa kiasi fulani: tulikuwa na ufahamu wazi wa kile tulichotarajia kutoka kwa makundi yetu, pamoja na mkakati mzuri wa kutekeleza mabadiliko yaliyopangwa.

Kubernetes: Ongeza kasi ya huduma zako kwa kuondoa mipaka ya CPU
Mawasiliano ya biashara juu ya suala kubwa.

Jinsi ya kulinda nodi zako wakati vikwazo vimeondolewa?

Kutengwa kwa huduma "zisizo na kikomo":

Katika siku za nyuma, tayari tumeona baadhi ya nodi zikiingia katika hali notReady, hasa kutokana na huduma ambazo zilitumia rasilimali nyingi sana.

Tuliamua kuweka huduma kama hizo katika nodi tofauti ("zilizowekwa alama") ili zisiingiliane na huduma "zinazohusiana". Matokeo yake, kwa kuashiria baadhi ya nodes na kuongeza parameter ya uvumilivu kwa huduma "zisizohusiana", tulipata udhibiti mkubwa juu ya nguzo, na ikawa rahisi kwetu kutambua matatizo na nodes. Ili kutekeleza michakato kama hiyo mwenyewe, unaweza kujijulisha na nyaraka.

Kubernetes: Ongeza kasi ya huduma zako kwa kuondoa mipaka ya CPU

НазначСниС ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ запроса процСссора ΠΈ памяти:

Hofu yetu kubwa ilikuwa kwamba mchakato huo ungetumia rasilimali nyingi na nodi ingeacha kujibu maombi. Kwa kuwa sasa (shukrani kwa Datadog) tunaweza kufuatilia kwa uwazi huduma zote kwenye nguzo yetu, nilichanganua miezi kadhaa ya utendakazi wa zile ambazo tulipanga kuzitaja kama "zisizohusiana". Ninaweka tu utumiaji wa juu wa CPU na ukingo wa 20%, na kwa hivyo nafasi iliyotengwa kwenye nodi ikiwa k8s itajaribu kugawa huduma zingine kwa nodi.

Kubernetes: Ongeza kasi ya huduma zako kwa kuondoa mipaka ya CPU

Kama unavyoona kwenye grafu, mzigo wa juu zaidi kwenye kichakataji umefikia 242m Cores za CPU (cores 0.242 za processor). Kwa ombi la processor, inatosha kuchukua nambari kubwa kidogo kuliko thamani hii. Tafadhali kumbuka kuwa kwa kuwa huduma zinazingatia watumiaji, viwango vya juu vya mzigo vinaambatana na trafiki.

Fanya vivyo hivyo na utumiaji wa kumbukumbu na hoja, na voila - uko tayari! Kwa usalama zaidi, unaweza kuongeza uwekaji kiotomatiki wa pod mlalo. Kwa hivyo, kila wakati mzigo wa rasilimali ni wa juu, kuongeza otomatiki kutaunda maganda mapya, na kubernetes itawasambaza kwa nodi zilizo na nafasi ya bure. Iwapo hakuna nafasi iliyobaki kwenye nguzo yenyewe, unaweza kujiwekea tahadhari au kusanidi nyongeza ya nodi mpya kupitia uwekaji picha wao otomatiki.

Kati ya minuses, inafaa kuzingatia kwamba tulipoteza katika "msongamano wa chombo", yaani. idadi ya vyombo vinavyoendesha kwenye nodi moja. Tunaweza pia kuwa na "kupumzika" nyingi kwa msongamano mdogo wa trafiki, na pia kuna nafasi kwamba utafikia mzigo wa juu wa processor, lakini nodi za autoscaling zinapaswa kusaidia na mwisho.

Matokeo

Nimefurahiya kuchapisha matokeo haya bora kutoka kwa majaribio katika wiki chache zilizopita; tayari tumeona maboresho makubwa katika kukabiliana na huduma zote zilizorekebishwa:

Kubernetes: Ongeza kasi ya huduma zako kwa kuondoa mipaka ya CPU

Tulipata matokeo bora kwenye ukurasa wetu wa nyumbani (buffer.com), hapo huduma iliharakishwa mara ishirini na mbili!

Kubernetes: Ongeza kasi ya huduma zako kwa kuondoa mipaka ya CPU

Je, mdudu wa Linux kernel umewekwa?

Ndiyo, Mdudu tayari umewekwa na urekebishaji umeongezwa kwenye kernel toleo la 4.19 na la juu zaidi.

Walakini, baada ya kusoma shida za kubernetes kwenye github kwa Septemba ya pili 2020 bado tunapata kutajwa kwa baadhi ya miradi ya Linux iliyo na mdudu sawa. Ninaamini kuwa usambazaji fulani wa Linux bado una mdudu huyu na wanafanya kazi tu kuirekebisha.

Ikiwa toleo lako la usambazaji ni la chini kuliko 4.19, ningependekeza uppdatering hadi hivi karibuni, lakini kwa hali yoyote unapaswa kujaribu kuondoa vikwazo vya processor na uone ikiwa throttling inaendelea. Hapo chini unaweza kuona orodha ya sehemu ya huduma za usimamizi wa Kubernetes na usambazaji wa Linux:

  • Debian: rekebisha iliyojumuishwa katika toleo la hivi karibuni la usambazaji, misamiati, na inaonekana safi kabisa (Agosti 2020) Baadhi ya matoleo ya awali yanaweza pia kusasishwa.
  • Ubuntu: rekebisha kuunganishwa katika toleo la hivi karibuni Ubuntu Focal Fossa 20.04
  • EKS bado ina marekebisho mwezi Desemba 2019. Ikiwa toleo lako ni la chini kuliko hili, unapaswa kusasisha AMI.
  • kops: Kuanzia Juni 2020 Ρƒ kops 1.18+ Picha kuu ya mwenyeji itakuwa Ubuntu 20.04. Ikiwa toleo lako la kops ni la zamani, unaweza kusubiri marekebisho. Sisi wenyewe tunasubiri sasa.
  • GKE (Google Cloud): Rekebisha imeunganishwa mwezi Januari 2020, hata hivyo kuna matatizo na throttling bado zinazingatiwa.

Nini cha kufanya ikiwa marekebisho yatarekebisha shida ya kusukuma?

Sina hakika kuwa shida imetatuliwa kabisa. Tunapofika kwenye toleo la kernel na marekebisho, nitajaribu nguzo na kusasisha chapisho. Ikiwa kuna mtu yeyote tayari amesasisha, ningependa kusoma matokeo yako.

Hitimisho

  • Ukifanya kazi na vyombo vya Docker chini ya Linux (haijalishi Kubernetes, Mesos, Swarm au vingine), vyombo vyako vinaweza kupoteza utendakazi kwa sababu ya kubana;
  • Jaribu kusasisha hadi toleo la hivi punde la usambazaji wako kwa matumaini kwamba hitilafu tayari imerekebishwa;
  • Kuondoa mipaka ya processor kutatua tatizo, lakini hii ni mbinu hatari ambayo inapaswa kutumika kwa tahadhari kali (ni bora kwanza kusasisha kernel na kulinganisha matokeo);
  • Ikiwa umeondoa vikomo vya CPU, fuatilia kwa makini CPU yako na matumizi ya kumbukumbu na uhakikishe kuwa rasilimali za CPU yako zinazidi matumizi yako;
  • Chaguo salama litakuwa kupima maganda kiotomatiki ili kuunda maganda mapya iwapo kuna upakiaji mkubwa wa maunzi, ili kubernetes iwagawie nodi za bure.

Natumai chapisho hili litakusaidia kuboresha utendakazi wa mifumo yako ya kontena.

PS Hapa mwandishi analingana na wasomaji na watoa maoni (kwa Kiingereza).


Chanzo: mapenzi.com

Kuongeza maoni