0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一图解析K8S OOM和CPU节流

马哥Linux运维 来源:sysdig 2023-02-15 17:17 次阅读

介绍

使用 Kubernetes 时,内存不足 (OOM) 错误和 CPU 节流是云应用程序中资源处理的主要难题。

这是为什么?

云应用程序中的 CPU 和内存要求变得越来越重要,因为它们与您的云成本直接相关。

通过 limits 和 requests ,您可以配置 pod 应如何分配内存和 CPU 资源,以防止资源匮乏并调整云成本。

如果节点没有足够的资源, Pod 可能会通过抢占或节点压力被驱当一个进程运行内存不足 (OOM) 时,它会被终止,因为它没有所需的资源。

如果 CPU 消耗高于实际限制,进程将开始节流。

但是,如何主动监控 Kubernetes Pod 到达 OOM 和 CPU 节流的距离有多近?

Kubernetes OOM

Pod 中的每个容器都需要内存才能运行。

Kubernetes limits 是在 Pod 定义或 Deployment 定义中为每个容器设置的。

所有现代 Unix 系统都有一种方法来终止进程,以防它们需要回收内存。这将被标记为错误 137 或OOMKilled.

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

此退出代码 137 表示该进程使用的内存超过允许的数量,必须终止。

这是 Linux 中存在的一个特性,内核oom_score为系统中运行的进程设置一个值。此外,它允许设置一个名为 oom_score_adj 的值,Kubernetes 使用该值来允许服务质量。它还具有一个 OOM Killer功能,它将审查进程并终止那些使用比他们应该使用上限更多的内存的进程。

请注意,在 Kubernetes 中,进程可以达到以下任何限制:

在容器上设置的 Kubernetes Limit。

在命名空间上设置的 Kubernetes ResourceQuota。

节点的实际内存大小。

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

内存过量使用

Limits 可以高于 requests,因此所有限制的总和可以高于节点容量。这称为过度使用,这很常见。实际上,如果所有容器使用的内存都比请求的多,它可能会耗尽节点中的内存。这通常会导致一些 pod 被杀死以释放一些内存。

监控 Kubernetes OOM

在 Prometheus 中使用 node exporter 时,有一个指标称为node_vmstat_oom_kill. 跟踪 OOM 终止发生的时间很重要,但您可能希望在此类事件发生之前提前了解此类事件。

相反,您可以检查进程与 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 节流

CPU 节流 是一种行为,当进程即将达到某些资源限制时,进程会变慢。

与内存情况类似,这些限制可能是:

在容器上设置的 Kubernetes Limit。

在命名空间上设置的 Kubernetes ResourceQuota。

节点的实际CPU大小。

想想下面的类比。我们有一条有一些交通的高速公路,其中:

CPU 就是路。

车辆代表进程,每个车辆都有不同的大小。

多条通道代表有多个核心。

一个 request 将是一条专用道路,如自行车道。这里的节流表现为交通堵塞:最终,所有进程都会运行,但一切都会变慢。

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

Kubernetes 中的 CPU 进程

CPU 在 Kubernetes 中使用 shares 处理。每个 CPU 核心被分成 1024 份,然后使用 Linux 内核的 cgroups(控制组)功能在所有运行的进程之间分配。

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

如果 CPU 可以处理所有当前进程,则不需要任何操作。如果进程使用超过 100% 的 CPU,那么份额就会到位。与任何 Linux Kernel 一样,Kubernetes 使用 CFS(Completely Fair Scheduler)机制,因此拥有更多份额的进程将获得更多的 CPU 时间。

与内存不同,Kubernetes 不会因为节流而杀死 Pod。

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

可以在 /sys/fs/cgroup/cpu/cpu.stat 中查看 CPU 统计信息

CPU 过度使用

正如我们在 限制和请求一文 中看到的,当我们想要限制进程的资源消耗时,设置限制或请求很重要。然而,请注意不要将请求总数设置为大于实际 CPU 大小,因为这意味着每个容器都应该有一定数量的 CPU。

监控 Kubernetes CPU 节流

您可以检查进程与 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

如果我们想跟踪集群中发生的节流量,cadvisor 提供container_cpu_cfs_throttled_periods_total和container_cpu_cfs_periods_total. 有了这两个,你就可以轻松计算出所有 CPU 周期的 throttling 百分比。

最佳实践

注意 limits 和 requests

限制是在节点中设置最大资源上限的一种方法,但需要谨慎对待这些限制,因为您可能最终会遇到一个进程被限制或终止的情况。

做好被驱逐的准备

通过设置非常低的请求,您可能认为这会为您的进程授予最少的 CPU 或内存。但是kubelet会首先驱逐那些使用率高于请求的 Pod,因此您将它们标记为第一个被杀死!

如果您需要保护特定 Pod 免遭抢占(当kube-scheduler需要分配新 Pod 时),请为最重要的进程分配优先级。

节流是无声的敌人

通过设置不切实际的限制或过度使用,您可能没有意识到您的进程正在受到限制,并且性能受到影响。主动监控您的 CPU 使用率并了解您在容器和命名空间中的实际限制。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10446

    浏览量

    206576
  • Unix系统
    +关注

    关注

    0

    文章

    15

    浏览量

    9581
  • LINUX内核
    +关注

    关注

    1

    文章

    311

    浏览量

    21389
  • CFS
    CFS
    +关注

    关注

    0

    文章

    7

    浏览量

    9013

原文标题:图解 K8S OOM 和 CPU 节流

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    全面提升,阿里云Docker/Kubernetes(K8S) 日志解决方案与选型对比

    摘要: 今天,日志服务再次升级Kubernetes(k8s)的日志解决方案。1分钟内即可完成整个集群部署,支持动态扩容,提供采集宿主机日志、容器日志、容器stdout等所有数据源的站式采集。点此
    发表于 02-28 12:49

    全面提升,阿里云Docker/Kubernetes(K8S) 日志解决方案与选型对比

    摘要: 今天,日志服务再次升级Kubernetes(k8s)的日志解决方案。1分钟内即可完成整个集群部署,支持动态扩容,提供采集宿主机日志、容器日志、容器stdout等所有数据源的站式采集。点此
    发表于 02-28 12:50

    K8S容器编排的互通测试

    K8S容器编排之NetWorkPolicy官方实例
    发表于 06-06 11:28

    从零开始入门 K8s| 阿里技术专家详解 K8s 核心概念

    的资料中也会看到“ks”这个词,也就是“K8s”,它是通过将 8 个字母“ubernete ”替换为“8”而导致的个缩写。Kubernetes 为什么要用“舵手”来命名呢?大家可以看
    发表于 09-20 14:52

    k8s核心原理学习指南3

    k8s学习3 - 核心原理
    发表于 09-25 16:37

    K8s 从懵圈到熟练 – 集群网络详解

    导读:阿里云 K8S 集群网络目前有两种方案:种是 flannel 方案;另外种是基于 calico 和弹性网卡 eni 的 terway 方案。Terway 和 flannel 类似
    发表于 10-14 15:06

    K8s 从懵圈到熟练 – 镜像拉取这件小事

    下载。K8s 实现的私有镜像自动拉取基本功能K8s 集群般会管理多个节点,每个节点都有自己的 docker 环境。如果让用户分别到集群节点上登录镜像仓库,这显然是很不方便的。为了解决这个问题,
    发表于 10-14 15:38

    从零开始入门 K8s | 应用存储和持久化数据卷:核心知识

    的常见类型:本地存储,常用的有 emptydir/hostpath;网络存储:网络存储当前的实现方式有两种,种是 in-tree,它的实现代码是放在 K8s 代码仓库中的,随着 K8s 对存储类型支持
    发表于 10-15 14:55

    从零开始入门 K8s | 应用存储和持久化数据卷:存储快照与拓扑调度

    是什么意思:这里所说的拓扑是 K8s 集群中为管理的 nodes 划分的种“位置”关系,意思为:可以通过在 node 的 labels 信息里面填写某个 node 属于某个拓扑。
    发表于 10-15 15:07

    从零开始入门 K8s | 可观测性:你的应用健康吗?

    时候需要自己对业务场景上来判断,这种的链接是否会对业务造成影响。 三、问题诊断接下来给大家讲解下在 K8s 中常见的问题诊断。应用故障排查-了解状态机制首先要了解K8s 中的
    发表于 10-15 15:32

    从零开始入门 K8s | 应用存储和持久化数据卷:核心知识

    首先看下 Pod Volumes 的常见类型:本地存储,常用的有 emptydir/hostpath;网络存储:网络存储当前的实现方式有两种,种是 in-tree,它的实现代码是放在 K8s 代码
    发表于 10-16 10:10

    k8s volume中的本地存储和网络存储

    八 、 k8s volume 本地存储和网络存储
    发表于 03-25 08:44

    搭建K8s环境平台的步骤

    1 搭建K8s环境平台规划1.1 单master集群1.2 多master集群
    发表于 11-04 06:03

    华硕电脑电路原理图解析

    华硕电脑电路原理图解析
    发表于 09-09 16:23 1526次下载

    Java怎么排查oom异常

    Java中的OOM(Out of Memory)异常是指当Java虚拟机的堆内存不足以容纳新的对象时抛出的异常。OOM异常是一种常见的运行时异常,经常出现在长时间运行的Java应用程序或处理大数
    的头像 发表于 12-05 13:47 470次阅读