一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一圖解析K8S OOM和CPU節(jié)流

馬哥Linux運(yùn)維 ? 來(lái)源:sysdig ? 2023-02-15 17:17 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

介紹

使用 Kubernetes 時(shí),內(nèi)存不足 (OOM) 錯(cuò)誤和 CPU 節(jié)流是云應(yīng)用程序中資源處理的主要難題。

這是為什么?

云應(yīng)用程序中的 CPU 和內(nèi)存要求變得越來(lái)越重要,因?yàn)樗鼈兣c您的云成本直接相關(guān)。

通過(guò) limits 和 requests ,您可以配置 pod 應(yīng)如何分配內(nèi)存和 CPU 資源,以防止資源匱乏并調(diào)整云成本。

如果節(jié)點(diǎn)沒(méi)有足夠的資源, Pod 可能會(huì)通過(guò)搶占或節(jié)點(diǎn)壓力被驅(qū)當(dāng)一個(gè)進(jìn)程運(yùn)行內(nèi)存不足 (OOM) 時(shí),它會(huì)被終止,因?yàn)樗鼪](méi)有所需的資源。

如果 CPU 消耗高于實(shí)際限制,進(jìn)程將開(kāi)始節(jié)流。

但是,如何主動(dòng)監(jiān)控 Kubernetes Pod 到達(dá) OOM 和 CPU 節(jié)流的距離有多近?

Kubernetes OOM

Pod 中的每個(gè)容器都需要內(nèi)存才能運(yùn)行。

Kubernetes limits 是在 Pod 定義或 Deployment 定義中為每個(gè)容器設(shè)置的。

所有現(xiàn)代 Unix 系統(tǒng)都有一種方法來(lái)終止進(jìn)程,以防它們需要回收內(nèi)存。這將被標(biāo)記為錯(cuò)誤 137 或OOMKilled.

State:Running
Started:Thu,10Oct20191113+0200
LastState:Terminated
Reason:OOMKilled
ExitCode:137
Started:Thu,10Oct20191103+0200
Finished:Thu,10Oct20191111+0200

此退出代碼 137 表示該進(jìn)程使用的內(nèi)存超過(guò)允許的數(shù)量,必須終止。

這是 Linux 中存在的一個(gè)特性,內(nèi)核oom_score為系統(tǒng)中運(yùn)行的進(jìn)程設(shè)置一個(gè)值。此外,它允許設(shè)置一個(gè)名為 oom_score_adj 的值,Kubernetes 使用該值來(lái)允許服務(wù)質(zhì)量。它還具有一個(gè) OOM Killer功能,它將審查進(jìn)程并終止那些使用比他們應(yīng)該使用上限更多的內(nèi)存的進(jìn)程。

請(qǐng)注意,在 Kubernetes 中,進(jìn)程可以達(dá)到以下任何限制:

在容器上設(shè)置的 Kubernetes Limit。

在命名空間上設(shè)置的 Kubernetes ResourceQuota。

節(jié)點(diǎn)的實(shí)際內(nèi)存大小。

de371d70-aa86-11ed-bfe3-dac502259ad0.png

內(nèi)存過(guò)量使用

Limits 可以高于 requests,因此所有限制的總和可以高于節(jié)點(diǎn)容量。這稱(chēng)為過(guò)度使用,這很常見(jiàn)。實(shí)際上,如果所有容器使用的內(nèi)存都比請(qǐng)求的多,它可能會(huì)耗盡節(jié)點(diǎn)中的內(nèi)存。這通常會(huì)導(dǎo)致一些 pod 被殺死以釋放一些內(nèi)存。

監(jiān)控 Kubernetes OOM

在 Prometheus 中使用 node exporter 時(shí),有一個(gè)指標(biāo)稱(chēng)為node_vmstat_oom_kill. 跟蹤 OOM 終止發(fā)生的時(shí)間很重要,但您可能希望在此類(lèi)事件發(fā)生之前提前了解此類(lèi)事件。

相反,您可以檢查進(jìn)程與 Kubernetes 限制的接近程度:

(sumby(namespace,pod,container)
(rate(container_cpu_usage_seconds_total{container!=""}[5m]))/sumby
(namespace,pod,container)
(kube_pod_container_resource_limits{resource="cpu"}))>0.8

Kubernetes CPU 節(jié)流

CPU 節(jié)流 是一種行為,當(dāng)進(jìn)程即將達(dá)到某些資源限制時(shí),進(jìn)程會(huì)變慢。

與內(nèi)存情況類(lèi)似,這些限制可能是:

在容器上設(shè)置的 Kubernetes Limit。

在命名空間上設(shè)置的 Kubernetes ResourceQuota。

節(jié)點(diǎn)的實(shí)際CPU大小。

想想下面的類(lèi)比。我們有一條有一些交通的高速公路,其中:

CPU 就是路。

車(chē)輛代表進(jìn)程,每個(gè)車(chē)輛都有不同的大小。

多條通道代表有多個(gè)核心。

一個(gè) request 將是一條專(zhuān)用道路,如自行車(chē)道。這里的節(jié)流表現(xiàn)為交通堵塞:最終,所有進(jìn)程都會(huì)運(yùn)行,但一切都會(huì)變慢。

de476a90-aa86-11ed-bfe3-dac502259ad0.gif

Kubernetes 中的 CPU 進(jìn)程

CPU 在 Kubernetes 中使用 shares 處理。每個(gè) CPU 核心被分成 1024 份,然后使用 Linux 內(nèi)核的 cgroups(控制組)功能在所有運(yùn)行的進(jìn)程之間分配。

deffc478-aa86-11ed-bfe3-dac502259ad0.png

如果 CPU 可以處理所有當(dāng)前進(jìn)程,則不需要任何操作。如果進(jìn)程使用超過(guò) 100% 的 CPU,那么份額就會(huì)到位。與任何 Linux Kernel 一樣,Kubernetes 使用 CFS(Completely Fair Scheduler)機(jī)制,因此擁有更多份額的進(jìn)程將獲得更多的 CPU 時(shí)間。

與內(nèi)存不同,Kubernetes 不會(huì)因?yàn)楣?jié)流而殺死 Pod。

df11bdea-aa86-11ed-bfe3-dac502259ad0.png

可以在 /sys/fs/cgroup/cpu/cpu.stat 中查看 CPU 統(tǒng)計(jì)信息

CPU 過(guò)度使用

正如我們?cè)?限制和請(qǐng)求一文 中看到的,當(dāng)我們想要限制進(jìn)程的資源消耗時(shí),設(shè)置限制或請(qǐng)求很重要。然而,請(qǐng)注意不要將請(qǐng)求總數(shù)設(shè)置為大于實(shí)際 CPU 大小,因?yàn)檫@意味著每個(gè)容器都應(yīng)該有一定數(shù)量的 CPU。

監(jiān)控 Kubernetes CPU 節(jié)流

您可以檢查進(jìn)程與 Kubernetes 限制的接近程度:

(sumby(namespace,pod,container)(rate(container_cpu_usage_seconds_total
{container!=""}[5m]))/sumby(namespace,pod,container)
(kube_pod_container_resource_limits{resource="cpu"}))>0.8

如果我們想跟蹤集群中發(fā)生的節(jié)流量,cadvisor 提供container_cpu_cfs_throttled_periods_total和container_cpu_cfs_periods_total. 有了這兩個(gè),你就可以輕松計(jì)算出所有 CPU 周期的 throttling 百分比。

最佳實(shí)踐

注意 limits 和 requests

限制是在節(jié)點(diǎn)中設(shè)置最大資源上限的一種方法,但需要謹(jǐn)慎對(duì)待這些限制,因?yàn)槟赡茏罱K會(huì)遇到一個(gè)進(jìn)程被限制或終止的情況。

做好被驅(qū)逐的準(zhǔn)備

通過(guò)設(shè)置非常低的請(qǐng)求,您可能認(rèn)為這會(huì)為您的進(jìn)程授予最少的 CPU 或內(nèi)存。但是kubelet會(huì)首先驅(qū)逐那些使用率高于請(qǐng)求的 Pod,因此您將它們標(biāo)記為第一個(gè)被殺死!

如果您需要保護(hù)特定 Pod 免遭搶占(當(dāng)kube-scheduler需要分配新 Pod 時(shí)),請(qǐng)為最重要的進(jìn)程分配優(yōu)先級(jí)。

節(jié)流是無(wú)聲的敵人

通過(guò)設(shè)置不切實(shí)際的限制或過(guò)度使用,您可能沒(méi)有意識(shí)到您的進(jìn)程正在受到限制,并且性能受到影響。主動(dòng)監(jiān)控您的 CPU 使用率并了解您在容器和命名空間中的實(shí)際限制。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11076

    瀏覽量

    217001
  • Unix系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    9817
  • LINUX內(nèi)核
    +關(guān)注

    關(guān)注

    1

    文章

    317

    瀏覽量

    22392
  • CFS
    CFS
    +關(guān)注

    關(guān)注

    0

    文章

    7

    瀏覽量

    9133

原文標(biāo)題:圖解 K8S OOM 和 CPU 節(jié)流

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    什么是 K8S,如何使用 K8S

    Kubernetes(簡(jiǎn)稱(chēng)K8S)是個(gè)用于管理容器化應(yīng)用程序的開(kāi)源平臺(tái)。以下是關(guān)于K8S及其使用方法的介紹: 、什么是 K8S 核心特
    發(fā)表于 06-25 06:45

    OpenStack與K8s結(jié)合的兩種方案的詳細(xì)介紹和比較

    OpenStack與K8S結(jié)合主要有兩種方案。K8S部署在OpenStack平臺(tái)之上,二是K8S和OpenStack組件集成。
    的頭像 發(fā)表于 10-14 09:38 ?2.8w次閱讀

    如何使用kubernetes client-go實(shí)踐個(gè)簡(jiǎn)單的與K8s交互過(guò)程

    【導(dǎo)讀】Kubernetes項(xiàng)目使用Go語(yǔ)言編寫(xiě),對(duì)Go api原生支持非常便捷。 本篇文章介紹了如何使用kubernetes client-go實(shí)踐個(gè)簡(jiǎn)單的與K8s交互過(guò)程
    的頭像 發(fā)表于 02-02 11:16 ?7275次閱讀
    如何使用kubernetes client-go實(shí)踐<b class='flag-5'>一</b>個(gè)簡(jiǎn)單的與<b class='flag-5'>K8s</b>交互過(guò)程

    關(guān)于K8s最詳細(xì)的解析

    個(gè)目標(biāo):容器操作;兩地三中心;四層服務(wù)發(fā)現(xiàn);五種Pod共享資源;六個(gè)CNI常用插件;七層負(fù)載均衡;八種隔離維度;九個(gè)網(wǎng)絡(luò)模型原則;十類(lèi)IP地址;百級(jí)產(chǎn)品線;千級(jí)物理機(jī);萬(wàn)級(jí)容器;相如無(wú)億,K8s有億:億級(jí)日服務(wù)人次。
    的頭像 發(fā)表于 04-08 13:55 ?7700次閱讀
    關(guān)于<b class='flag-5'>K8s</b>最詳細(xì)的<b class='flag-5'>解析</b>

    Docker不香嗎為什么還要用K8s

    Docker 雖好用,但面對(duì)強(qiáng)大的集群,成千上萬(wàn)的容器,突然感覺(jué)不香了。 這時(shí)候就需要我們的主角 Kubernetes 上場(chǎng)了,先來(lái)了解K8s 的基本概念,后面再介紹實(shí)踐,由淺入深步步為營(yíng)
    的頭像 發(fā)表于 06-02 11:56 ?3689次閱讀

    簡(jiǎn)單說(shuō)明k8s和Docker之間的關(guān)系

    這篇文章主要介紹了k8s和Docker關(guān)系簡(jiǎn)單說(shuō)明,本文利用圖文講解的很透徹,有需要的同學(xué)可以研究下 最近項(xiàng)目用到kubernetes(以下簡(jiǎn)稱(chēng)k8sks之間有
    的頭像 發(fā)表于 06-24 15:48 ?3722次閱讀

    K8S集群服務(wù)訪問(wèn)失敗怎么辦 K8S故障處理集錦

    問(wèn)題1:K8S集群服務(wù)訪問(wèn)失?。?? ? 原因分析:證書(shū)不能被識(shí)別,其原因?yàn)椋鹤远x證書(shū),過(guò)期等。 解決方法:更新證書(shū)即可。 問(wèn)題2:K8S集群服務(wù)訪問(wèn)失敗? curl: (7) Failed
    的頭像 發(fā)表于 09-01 11:11 ?1.6w次閱讀
    <b class='flag-5'>K8S</b>集群服務(wù)訪問(wèn)失敗怎么辦 <b class='flag-5'>K8S</b>故障處理集錦

    K8S(kubernetes)學(xué)習(xí)指南

    K8S(kubernetes)學(xué)習(xí)指南
    發(fā)表于 06-29 14:14 ?0次下載

    mysql部署在k8s上的實(shí)現(xiàn)方案

    的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)) 應(yīng)用軟件之。這里主要講 mysql 部署在 k8s 上,mysql 部署在 k8s 上的優(yōu)勢(shì)主要有以下幾點(diǎn)。
    的頭像 發(fā)表于 09-26 10:39 ?2832次閱讀

    k8s是什么意思?kubeadm部署k8s集群(k8s部署)|PetaExpres

    k8s是什么意思? kubernetes簡(jiǎn)稱(chēng)K8s,是個(gè)開(kāi)源的,用于管理云平臺(tái)中多個(gè)主機(jī)上的容器化的應(yīng)用,Kubernetes的目標(biāo)是讓部署容器化的應(yīng)用簡(jiǎn)單并且高效(powerful
    發(fā)表于 07-19 13:14 ?1321次閱讀

    什么是K3sK8s?K3sK8s有什么區(qū)別?

    Kubernetes,通??s寫(xiě)為 K8s,是領(lǐng)先的容器編排工具。該開(kāi)源項(xiàng)目最初由 Google 開(kāi)發(fā),幫助塑造了現(xiàn)代編排的定義。該系統(tǒng)包括了部署和運(yùn)行容器化系統(tǒng)所需的切。
    的頭像 發(fā)表于 08-03 10:53 ?8478次閱讀

    k8s生態(tài)鏈包含哪些技術(shù)

    1. Apache APISIX Ingress 定義 ? 在 K8s 生態(tài)中,Ingress 作為表示 K8s 流量入口的種資源,想要讓其生效,就需要有個(gè) Ingress Con
    的頭像 發(fā)表于 08-07 10:56 ?1540次閱讀
    <b class='flag-5'>k8s</b>生態(tài)鏈包含哪些技術(shù)

    跑大模型AI的K8s與普通K8s的區(qū)別分析

    Kubernetes是個(gè)在大量節(jié)點(diǎn)上管理容器的系統(tǒng),其主要功能總結(jié)起來(lái),就是在想要啟動(dòng)容器的時(shí)候,負(fù)責(zé)“找個(gè)「空閑」節(jié)點(diǎn),啟動(dòng)容器”。但是它默認(rèn)考慮的啟動(dòng)因素(資源類(lèi))主要就是“CPU+內(nèi)存”。就是容器指定“我要多少
    發(fā)表于 09-03 12:07 ?1246次閱讀

    k8s云原生開(kāi)發(fā)要求

    Kubernetes(K8s)云原生開(kāi)發(fā)對(duì)硬件有定要求。CPU方面,建議至少配備2個(gè)邏輯核心,高性能CPU更佳。內(nèi)存至少4GB,但8GB或
    的頭像 發(fā)表于 10-24 10:03 ?584次閱讀
    <b class='flag-5'>k8s</b>云原生開(kāi)發(fā)要求

    k8s和docker區(qū)別對(duì)比,哪個(gè)更強(qiáng)?

    Docker和Kubernetes(K8s)是容器化技術(shù)的兩大流行工具。Docker關(guān)注構(gòu)建和打包容器,適用于本地開(kāi)發(fā)和單主機(jī)管理;而K8s則提供容器編排和管理平臺(tái),適用于多主機(jī)或云環(huán)境,具備自動(dòng)化
    的頭像 發(fā)表于 12-11 13:55 ?669次閱讀