ʻO nā palena CPU a me ka hoʻopaʻa ʻana i nā Kubernetes

Nānā. unuhi.: ʻO kēia moʻolelo makaʻala o Omio—he hui huakaʻi huakaʻi ʻEulopa—e lawe i ka poʻe heluhelu mai ka manaʻo kumu a hiki i nā mea paʻakikī o ka hoʻonohonoho Kubernetes. ʻO ka ʻike ʻana i ia mau hihia ʻaʻole kōkua wale i ka hoʻonui ʻana i kou ʻike, akā pale pū kekahi i nā pilikia non-trivial.

ʻO nā palena CPU a me ka hoʻopaʻa ʻana i nā Kubernetes

Ua loaʻa paha iā ʻoe kahi palapala noi i hoʻopaʻa ʻia ma kahi, hoʻōki i ka pane ʻana i nā loiloi olakino, a ʻaʻole hiki ke ʻike i ke kumu? Hoʻokahi wehewehe ʻana e pili ana i nā palena quota kumu waiwai CPU. ʻO kēia ka mea a mākou e kamaʻilio ai ma kēia ʻatikala.

Aku; DR:
Manaʻo ikaika mākou i ka hoʻopau ʻana i nā palena CPU ma Kubernetes (a i ʻole ka hoʻopaʻa ʻana i nā quota CFS ma Kubelet) inā ʻoe e hoʻohana nei i kahi mana o ka Linux kernel me kahi pahu kuʻuna CFS. I ke kumu aia ma laila koʻikoʻi a maopopo he kino e alakaʻi i ka throttling nui a me ka lohi
.

Ma Omio mālama ʻia nā ʻōnaehana holoʻokoʻa e Kubernetes. ʻO kā mākou mau hana mokuʻāina a pau ʻole e holo wale ma nā Kubernetes (hoʻohana mākou iā Google Kubernetes Engine). I loko o nā mahina ʻeono i hala iho nei, ua hoʻomaka mākou e ʻike i ka lohi ʻole. Hoʻokuʻu a hoʻōki paha nā noi i ka pane ʻana i nā loiloi olakino, nalowale ka pilina i ka pūnaewele, etc. Ua pilikia mākou i kēia ʻano no ka manawa lōʻihi, a ma hope ua hoʻoholo mākou e noʻonoʻo i ka pilikia.

Hōʻuluʻulu manaʻo o ka ʻatikala:

  • He mau huaʻōlelo e pili ana i nā ipu a me nā Kubernetes;
  • Pehea e hoʻokō ʻia ai nā noi a me nā palena CPU;
  • Pehea ka hana ʻana o ka palena CPU i nā kaiapuni multi-core;
  • Pehea e ʻimi ai i ka throttling CPU;
  • Hoʻoponopono pilikia a me nā nuances.

He mau huaʻōlelo e pili ana i nā ipu a me nā Kubernetes

ʻO Kubernetes ka maʻamau o kēia manawa i ka honua ʻoihana. ʻO kāna hana nui, ʻo ia ka hoʻoponopono ipu.

Nā pahu pahu

I ka wā ma mua, pono mākou e hana i nā mea kiʻi e like me Java JARs/WARs, Python Eggs, a i ʻole executables e holo ma nā kikowaena. Eia nō naʻe, no ka hana ʻana iā lākou, pono e hana ʻia nā hana ʻē aʻe: hoʻokomo i ka runtime environment (Java/Python), kau i nā faila pono i nā wahi kūpono, e hōʻoia i ka hoʻohālikelike ʻana me kahi ʻano kikoʻī o ka ʻōnaehana hana, etc. I nā huaʻōlelo ʻē aʻe, pono e uku ʻia ka nānā pono ʻana i ka hoʻokele hoʻonohonoho hoʻonohonoho (ʻo ia ke kumu o ka paio ma waena o nā mea hoʻomohala a me nā luna ʻōnaehana).

Ua hoʻololi nā pahu i nā mea a pau. I kēia manawa, he kiʻi pahu ka artifact. Hiki ke hōʻike ʻia e like me ke ʻano o ka faila hiki ke hoʻonui ʻia i loaʻa ʻaʻole wale ka papahana, akā he ʻano hoʻokō piha hoʻi (Java/Python/...), a me nā faila e pono ai, i kau mua ʻia a mākaukau e holo. Hiki ke kau ʻia nā pahu a holo ma nā kikowaena like ʻole me ka ʻole o nā ʻanuʻu ʻē aʻe.

Eia kekahi, hana nā ipu i loko o kā lākou wahi pahu one. Loaʻa iā lākou kā lākou kikowaena pūnaewele virtual, kā lākou ʻōnaehana faila me ka palena palena, kā lākou hierarchy o nā kaʻina hana, ko lākou mau palena ponoʻī ma ka CPU a me ka hoʻomanaʻo, a me nā mea a pau.

Kubernetes

E like me ka mea i ʻōlelo ʻia ma mua, ʻo Kubernetes kahi mea hoʻokani pahu. E like me kēia: hāʻawi ʻoe iā ia i kahi wai o nā mīkini, a laila e ʻōlelo: "E nā Kubernetes, e hoʻomaka kākou i ʻumi mau manawa o kaʻu pahu me 2 kaʻina hana a me 3 GB o ka hoʻomanaʻo i kēlā me kēia, a mālama iā lākou e holo!" Na Kubernetes e mālama i ke koena. E loaʻa iā ia ka mana manuahi, hoʻokuʻu i nā ipu a hoʻomaka hou iā lākou inā pono, e ʻōwili i kahi mea hou i ka wā e hoʻololi ai i nā mana, etc. ʻO ka mea nui, ʻae ʻo Kubernetes iā ʻoe e hoʻokaʻawale i ka ʻāpana hāmeʻa a hana i nā ʻōnaehana ākea ākea e kūpono no ka lawe ʻana a me ka holo ʻana i nā noi.

ʻO nā palena CPU a me ka hoʻopaʻa ʻana i nā Kubernetes
Kubernetes mai ka manaʻo o ke kanaka

He aha nā noi a me nā palena ma Kubernetes

ʻAe, ua uhi mākou i nā ipu a me nā Kubernetes. Ua ʻike nō hoʻi mākou hiki i nā pahu he nui ke noho ma ka mīkini hoʻokahi.

Hiki ke kiʻi ʻia kahi hoʻohālikelike me kahi keʻena hui. Lawe ʻia a hoʻolimalima ʻia kahi wahi ākea (mīkini / ʻāpana) i kekahi mau mea hoʻolimalima (nā pahu). Hana ʻo Kubernetes ma ke ʻano he mea kūʻai. Ke kū nei ka nīnau, pehea e mālama ai i nā mea hoʻolimalima mai nā hakakā me kekahi? He aha inā inā hoʻoholo kekahi o lākou e hōʻaiʻē i ka lumi lumi no ka hapalua o ka lā?

ʻO kēia kahi e komo ai nā noi a me nā palena. CPU noi pono wale no ka hoʻolālā. He mea kēia e like me ka "papa inoa makemake" o ka pahu, a hoʻohana ʻia e koho i ka node kūpono loa. I ka manawa like ka CPU kali hiki ke hoʻohālikelike ʻia me kahi ʻaelike hoʻolimalima - ke koho koke mākou i kahi ʻāpana no ka ipu, ka hiki ole e hele ma mua o nā palena i hoʻokumu ʻia. A ma laila ka pilikia ...

Pehea e hoʻokō ʻia ai nā noi a me nā palena ma Kubernetes

Hoʻohana ʻo Kubernetes i kahi hana throttling (hoʻokuʻu i nā pōʻai uaki) i kūkulu ʻia i loko o ka kernel e hoʻokō i nā palena CPU. Inā ʻoi aku kahi noi ma mua o ka palena, hiki ke hoʻopaʻa ʻia (ʻo ia hoʻi. Hoʻonohonoho ʻokoʻa nā noi a me nā palena no ka hoʻomanaʻo, no laila maʻalahi lākou e ʻike. No ka hana ʻana i kēia, e nānā wale i ke kūlana hoʻomaka hou o ka pod: inā paha ʻo "OOMKilled". ʻAʻole maʻalahi ka hoʻopaʻa ʻana i ka CPU, no ka mea, hoʻohana wale ʻo K8 i nā metric ma ka hoʻohana ʻana, ʻaʻole ma nā hui.

Noi CPU

ʻO nā palena CPU a me ka hoʻopaʻa ʻana i nā Kubernetes
Pehea e hoʻokō ʻia ai ka noi CPU

No ka maʻalahi, e nānā kākou i ke kaʻina hana me ka mīkini me ka CPU 4-core ma ke ʻano he laʻana.

Hoʻohana ʻo K8s i kahi hui pūʻulu mana (cgroups) e mālama i ka hoʻokaʻawale ʻana i nā kumuwaiwai (memo a me ka mea hana). Loaʻa ka hierarchical model nona: na ke keiki i hoʻoili i nā palena o ka hui makua. Mālama ʻia nā kikoʻī hoʻoili ma kahi ʻōnaehana faila virtual (/sys/fs/cgroup). I ka hihia o kahi mea hana kēia /sys/fs/cgroup/cpu,cpuacct/*.

Hoʻohana ʻo K8s i ka faila cpu.share e hoʻokaʻawale i nā kumuwaiwai processor. I kā mākou hihia, loaʻa i ke kumu cgroup he 4096 mau ʻāpana o nā kumuwaiwai CPU - 100% o ka mana kaʻina hana i loaʻa (1 core = 1024; he waiwai paʻa kēia). Hāʻawi ka pūʻulu kumu i nā kumuwaiwai ma muli o nā ʻāpana o nā mamo i hoʻopaʻa inoa ʻia cpu.share, a pela lakou e hana ai me ka lakou poe mamo, etc. Ma kahi node Kubernetes maʻamau, ʻekolu keiki o ka pūʻulu kumu: system.slice, user.slice и kubepods. Hoʻohana ʻia nā pūʻulu mua ʻelua e puʻunaue i nā kumuwaiwai ma waena o nā ukana ʻōnaehana koʻikoʻi a me nā polokalamu mea hoʻohana ma waho o K8s. ʻO ka hope - kubepods — hana ʻia e Kubernetes e puʻunaue i nā kumuwaiwai ma waena o nā pods.

Hōʻike ke kiʻikuhi ma luna nei ua loaʻa i nā pūʻulu mua a me ka lua i kēlā me kēia 1024 kaʻana like, me ka subgroup kuberpod i hoʻokaʻawale ʻia 4096 mahele Pehea e hiki ai: ma hope o nā mea a pau, hiki i ka pūʻulu kumu ke komo wale 4096 mahele, a ua oi loa aku ka huina o na mahele o kana poe mamo i keia helu (6144)? ʻO ka manaʻo, ʻo ka waiwai ke kūpono, no laila ke hoʻohana nei ka mea hoʻonohonoho Linux (CFS) iā ia e hoʻokaʻawale i nā kumuwaiwai CPU. I kā mākou hihia, loaʻa nā hui mua ʻelua 680 ʻāpana maoli (16,6% o 4096), a loaʻa ke kubepod i ke koena 2736 mahele I ka wā haʻahaʻa, ʻaʻole e hoʻohana nā hui ʻelua i nā kumuwaiwai i hāʻawi ʻia.

ʻO ka mea pōmaikaʻi, loaʻa i ka mea hoʻonohonoho kahi hana e pale ai i ka hoʻopau ʻana i nā kumuwaiwai CPU i hoʻohana ʻole ʻia. Hoʻololi ia i ka mana "idle" i kahi loko wai honua, kahi e puʻunaue ʻia ai i nā hui e pono ai ka mana hana hou (e hana ʻia ka hoʻololi ʻana i nā pūʻulu e pale ai i nā poho pōʻai). Hoʻohana ʻia kahi ʻano like i nā mamo a pau o nā mamo.

Mālama kēia ʻano hana i ka hāʻawi pono ʻana i ka mana kaʻina hana a hōʻoia i ʻaʻohe mea e "ʻaihue" i nā kumuwaiwai mai nā poʻe ʻē aʻe.

Ka palena CPU

ʻOiai ke ʻano like o ka hoʻonohonoho ʻana o nā palena a me nā noi ma K8, ʻokoʻa loa kā lākou hoʻokō: ʻo kēia. hoopunipuni loa a me ka hapa liʻiliʻi i palapala ʻia.

Hoʻopili ʻo K8s CFS quota mechanism e hoʻokō i nā palena. Hoʻonohonoho ʻia kā lākou hoʻonohonoho i nā faila cfs_period_us и cfs_quota_us i ka papa kuhikuhi cgroup (aia ka faila ma laila cpu.share).

like cpu.share, ua pili ka quota ma manawa manawa, a ʻaʻole ma ka mana kaʻina hana i loaʻa. cfs_period_us hōʻike i ka lōʻihi o ka manawa (epoch) - ʻo ia mau 100000 μs (100 ms). Aia kahi koho e hoʻololi i kēia waiwai ma K8s, akā aia wale nō ma ka alpha no kēia manawa. Hoʻohana ka mea hoʻonohonoho i ka manawa e hoʻomaka hou i nā kuʻuna i hoʻohana ʻia. waihona lua cfs_quota_us, kuhikuhi i ka manawa i loaʻa (quota) i kēlā me kēia manawa. E hoʻomanaʻo, ua kuhikuhi ʻia i nā microseconds. ʻOi aku paha ka quota i ka lōʻihi o ka manawa; ʻo ia hoʻi, ʻoi aku paha ia ma mua o 100 ms.

E nānā kākou i ʻelua mau hiʻohiʻona ma nā mīkini 16-core (ke ʻano kamepiula maʻamau a mākou ma Omio):

ʻO nā palena CPU a me ka hoʻopaʻa ʻana i nā Kubernetes
Hōʻike 1: 2 mau kaula a me kahi palena 200 ms. ʻAʻohe throttling

ʻO nā palena CPU a me ka hoʻopaʻa ʻana i nā Kubernetes
Nānā 2: 10 mau kaula a me 200 ms palena. Hoʻomaka ka throttling ma hope o 20 ms, hoʻomaka hou ke komo ʻana i nā kumuwaiwai hana ma hope o 80 ms

E ʻōlelo mākou ua hoʻonoho ʻoe i ka palena CPU i 2 nā kīʻaha; Na Kubernetes e unuhi i kēia waiwai i 200 ms. ʻO kēia ka mea hiki i ka ipu ke hoʻohana i ka nui o 200ms o ka manawa CPU me ka ʻole o ka throttling.

A ma laila e hoʻomaka ai ka leʻaleʻa. E like me ka mea i ʻōlelo ʻia ma luna, ʻo ka quota i loaʻa he 200 ms. Inā ʻoe e hana like ana he umi nā lola ma ka mīkini 12-core (e nānā i ke kiʻi no ka hiʻohiʻona 2), ʻoiai ʻaʻole nā ​​​​poʻa ʻē aʻe a pau, e pau ka quota i 20 ms wale nō (mai ka 10 * 20 ms = 200 ms), a e kau nā kaula āpau o kēia pod. » (paepae) no ka 80 ms e hiki mai ana. ʻO ka mea i haʻi mua ʻia mea hoʻonohonoho hoʻonohonoho, ma muli o ka nui o ka throttling a ʻaʻole hiki i ka pahu ke hoʻokō i ka quota i loaʻa.

Pehea e noʻonoʻo ai i ka throttling ma nā pods?

E komo wale i ka pod a hoʻokō cat /sys/fs/cgroup/cpu/cpu.stat.

  • nr_periods - ka huina o nā manawa hoʻonohonoho;
  • nr_throttled - ka helu o nā manawa throttled i ka haku mele nr_periods;
  • throttled_time - ka manawa throttled kumulative i nanoseconds.

ʻO nā palena CPU a me ka hoʻopaʻa ʻana i nā Kubernetes

He aha ka mea e hana nei?

ʻO ka hopena, loaʻa iā mākou ka throttling kiʻekiʻe ma nā noi āpau. I kekahi manawa aia ʻo ia i loko hoʻokahi manawa a me ka hapa ʻoi aku ka ikaika ma mua o ka helu ʻana!

Ke alakaʻi nei kēia i nā hewa like ʻole - hiki ʻole ke nānā i ka mākaukau, hoʻokuʻu ʻia ka pahu, haʻihaʻi ka pilina pūnaewele, nā manawa i loko o nā kelepona lawelawe. ʻO kēia ka hopena i ka piʻi ʻana o ka latency a me ka nui o ka hewa.

Hoʻoholo a me nā hopena

He mea maʻalahi nā mea a pau maʻaneʻi. Ua haʻalele mākou i nā palena CPU a hoʻomaka mākou e hoʻonui i ka kernel OS i loko o nā pūʻulu i ka mana hou loa, kahi i hoʻopaʻa ʻia ai ka bug. Ua emi koke ka helu o nā hewa (HTTP 5xx) i kā mākou lawelawe:

Nā hewa HTTP 5xx

ʻO nā palena CPU a me ka hoʻopaʻa ʻana i nā Kubernetes
Nā hewa HTTP 5xx no hoʻokahi lawelawe koʻikoʻi

Manawa pane p95

ʻO nā palena CPU a me ka hoʻopaʻa ʻana i nā Kubernetes
ʻO ka latency noi lawelawe koʻikoʻi, 95th percentile

Na koina hana

ʻO nā palena CPU a me ka hoʻopaʻa ʻana i nā Kubernetes
Ka helu o nā hola i hala

He aha ka mea kuhi?

E like me ka mea i ʻōlelo ʻia ma ka hoʻomaka o ka ʻatikala:

Hiki ke kiʻi ʻia kahi ʻano hoʻohālikelike me kahi keʻena kaiapuni... Hana ʻo Kubernetes ma ke ʻano he mea kūʻai. Akā, pehea e mālama ai i nā mea hoʻolimalima mai nā hakakā me kekahi? He aha inā inā hoʻoholo kekahi o lākou e hōʻaiʻē i ka lumi lumi no ka hapalua o ka lā?

Eia ka hopu. Hiki i kekahi pahu mālama ʻole ke ʻai i nā kumuwaiwai CPU āpau i loaʻa ma kahi mīkini. Inā loaʻa iā ʻoe kahi waihona noi akamai (no ka laʻana, JVM, Go, Node VM ua hoʻonohonoho pono ʻia), a laila ʻaʻole pilikia kēia: hiki iā ʻoe ke hana i ia mau kūlana no ka manawa lōʻihi. Akā inā ʻaʻole maikaʻi ʻia nā noi a ʻaʻole maikaʻi loa (FROM java:latest), hiki ʻole ke kūlana. Ma Omio ua loaʻa iā mākou nā waihona Dockerfiles automated me nā hoʻonohonoho paʻamau kūpono no ka waihona ʻōlelo nui, no laila ʻaʻole i loaʻa kēia pilikia.

Paipai mākou i ka nānā ʻana i nā ana Mālama (hoʻohana, saturation a me nā hewa), nā lohi API a me nā helu kuhi. E hōʻoia i nā hopena i kūpono i nā manaʻo.

kūmole

ʻO kā mākou moʻolelo kēia. Ua kōkua nui kēia mau mea i ka hoʻomaopopo ʻana i ka mea e hana nei:

Nā hōʻike ʻino Kubernetes:

Ua loaʻa paha ʻoe i nā pilikia like i kāu hoʻomaʻamaʻa a i ʻole ka ʻike e pili ana i ka throttling i loko o nā wahi hana containerized? Kaʻana like i kāu moʻolelo ma nā manaʻo!

PS mai ka unuhi

E heluhelu pū ma kā mākou blog:

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka