云原生之深入解析OOM和CPU节流

一、前言

  • 使用 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, 10 Oct 2019 11:14:13 +0200
    Last State:     Terminated
      Reason:       OOMKilled
      Exit Code:    137
      Started:      Thu, 10 Oct 2019 11:04:03 +0200
      Finished:     Thu, 10 Oct 2019 11:14:11 +0200
  • 此退出代码 137 表示该进程使用的内存超过允许的数量,必须终止。这是 Linux 中存在的一个特性,内核 oom_score 为系统中运行的进程设置一个值。此外,它允许设置一个名为 oom_score_adj 的值,Kubernetes 使用该值来允许服务质量。它还具有一个 OOM Killer功能,它将审查进程并终止那些使用比他们应该使用上限更多的内存的进程。
  • 请注意,在 Kubernetes 中,进程可以达到以下任何限制:
    • 在容器上设置的 Kubernetes Limit;
    • 在命名空间上设置的 Kubernetes ResourceQuota;
    • 节点的实际内存大小。

在这里插入图片描述

三、内存过量使用

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

① 监控 Kubernetes OOM

  • 在 Prometheus 中使用 node exporter 时,有一个指标称为 node_vmstat_oom_kill,跟踪 OOM 终止发生的时间很重要,但可能希望在此类事件发生之前提前了解此类事件。
  • 相反,可以检查进程与 Kubernetes 限制的接近程度:
(sum by (namespace,pod,container)
(rate(container_cpu_usage_seconds_total{container!=""}[5m])) / sum by
(namespace,pod,container)
(kube_pod_container_resource_limits{resource="cpu"})) > 0.8

② Kubernetes CPU 节流

  • CPU 节流 是一种行为,当进程即将达到某些资源限制时,进程会变慢。
  • 与内存情况类似,这些限制可能是:
    • 在容器上设置的 Kubernetes Limit。
    • 在命名空间上设置的 Kubernetes ResourceQuota。
    • 节点的实际CPU大小。
  • 想想下面的类比,我们有一条有一些交通的高速公路,其中:
    • CPU 就是路。
    • 车辆代表进程,每个车辆都有不同的大小。
    • 多条通道代表有多个核心。
  • 一个 request 将是一条专用道路,如自行车道。这里的节流表现为交通堵塞,最终,所有进程都会运行,但一切都会变慢。

在这里插入图片描述

③ Kubernetes 中的 CPU 进程

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

在这里插入图片描述

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

在这里插入图片描述

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

四、CPU 过度使用

  • 当想要限制进程的资源消耗时,设置限制或请求很重要。然而,请注意不要将请求总数设置为大于实际 CPU 大小,因为这意味着每个容器都应该有一定数量的 CPU。
  • 监控 Kubernetes CPU 节流,可以检查进程与 Kubernetes 限制的接近程度:
(sum by (namespace,pod,container)(rate(container_cpu_usage_seconds_total
{container!=""}[5m])) / sum by (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 使用率并了解在容器和命名空间中的实际限制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/250495.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java数据结构篇——单链表的基本操作

1. 前言 在上一篇《Java数据结构篇——实现顺序表的增删查改》,我们已经熟悉了 ArrayList 的使用并且进行了简单的模拟实现。ArrayList底层使用数组来存储元素,由于其底层是一段连续的空间,当ArrayList 任意位置插入或者删除元素时&#xff…

使用下载代替物理串口输出-STM32 Debug (printf) Viewer

使用下载代替物理串口输出-STM32 Debug 硬件要求配置方法代码要求打印输出结果 硬件要求 STM32的PB9、PB10引脚的串口1通常用作其他功能使用后,无法通过printf()函数打印输出想要调试输出查看变量或调试信息。现已使用另外一种方法实现printf()函数打印输出。 ST…

AutoGen多代理对话项目示例和工作流程分析

在这篇文章中,我将介绍AutoGen的多个代理的运行。这些代理将能够相互对话,协作评估股票价格,并使用AmCharts生成图表。 我们创建对话的目的是要求代理分析特定公司的股票价格,并制作股票价格图表。 为了实现这一目标,…

oracle DG 三种应用机制

首先理解不管是哪种机制,oracle都不是从主库直接传归档文件到备库,而是通过网络将主库的redo数据传输到备库: 1、普通DG是主库发生日志切换,备库把接收到的redo数据在备库通过归档进程生成为归档文件进行应用 2、ADG则是备库把接收…

Windows mysql5.7 执行查询/开启/测试binlog---简易记录

前言:基于虚拟机mysql版本为5.7,增量备份测试那就要用到binlog… 简述:二进制日志(binnary log)以事件形式记录了对MySQL数据库执行更改的所有操作。 binlog是记录所有数据库表结构变更(例如CREATE、ALTER…

轻松搭建FPGA开发环境:第三课——Vivado 库编译与设置说明

工欲善其事必先利其器,很多人想从事FPGA的开发,但是不知道如何下手。既要装这个软件,又要装那个软件,还要编译仿真库,网上的教程一大堆,不知道到底应该听谁的。所以很多人还没开始就被繁琐的开发环境搭建吓…

在非联网、无网络环境下,fpm的安装和生成RPM包的使用案例

文章目录 前言1、安装fpm1.1、安装Ruby环境1.2、gem 安装 fpm 2、fpm使用2.1、fpm常用参数2.2、fpm使用案例2.2.1、fpmFirstDemo文件夹2.2.3、编写脚本文件2.2.4、生成RPM包2.2.5、RPM安装与卸载测试 前言 由于fpm采用Ruby语言开发,因此在使用之前需要先在您的虚拟…

Java只有值传递,没有引用传递!

结论:Java中的参数传递,只有值传递,没有引用传递! 以下均为错误理解: 值传递和引用传递,区别在于传递的内容。如果是个值,就是值传递;如果是个引用,就是引用传递Java是引…

力扣日记12.13-【二叉树篇】从中序与后序遍历序列构造二叉树

力扣日记:【二叉树篇】从中序与后序遍历序列构造二叉树 日期:2023.12.13 参考:代码随想录、力扣 106. 从中序与后序遍历序列构造二叉树 题目描述 难度:中等 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二…

Prometheus

Prometheus [系统性能优化实践]JVM进阶实战之监控工具(Prometheus) https://www.cnblogs.com/johnnyzen/p/17388354.html ubuntu 22.04 配置 Prometheus 和 Grafana 服务器监控 https://blog.csdn.net/nvd11/article/details/128030197 Prometheus 是一个开源的监控系统&…

深入理解网络 I/O:单 Group 混杂模式|多 Group 主从模式

🔭 嗨,您好 👋 我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、Java,后续其他专栏会持续优化更新迭代 🌲文章所在专栏&…

Threejs漫天多彩粒子天空--粒子系统打造

一、导语 漫天多彩粒子天空特效应该也是Threejs项目中挺常见的一个需求,因为它是基于粒子系统,可以衍生出许多的不一样的方案,比如,星空特效,下雨特效,飘雪特效等等,不仅可以用在项目中增加氛围…

二叉搜索树的实现

本文旨在讲解如何编写一颗二叉搜索树,包括基本的增删查改的操作。 目录 一、二叉搜索树的概念 ​编辑二、二叉搜索树的编写 2.1节点的编写 2.2节点的插入 2.3节点的查找 2.4节点的删除 三、二叉搜索树的应用 四、 二叉搜索树的性能分析 五、完整代码 一、…

CD8+T细胞通过NKG2D-NKG2DL轴维持对MHC-I阴性肿瘤细胞的杀伤

今天给同学们分享一篇实验文章“CD8 T cells maintain killing of MHC-I-negative tumor cells through the NKG2D-NKG2DL axis”,这篇文章发表在Nat Cancer期刊上,影响因子为22.7。 结果解读: MHC-I阴性肿瘤的免疫疗法需要CD8 T细胞 作者先…

现代雷达车载应用——第2章 汽车雷达系统原理 2.2节 汽车雷达架构

经典著作,值得一读,英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.2 汽车雷达架构 从顶层来看,基本的汽车雷达由发射器,接收器和天线组成。图2.2给出了一种简化的单通道连续波雷达结构[2]。这…

什么是网络丢包以及如何解决

丢包的概念一直是网络行业争论的话题,在设计和实现网络时,它始终是考虑的关键因素,其重要性在于它对网络和网络系统的效率和整体性能的直接影响,即使是单个故障设备或配置错误的设置也会导致数据包丢失,也会严重影响整…

2 Mycat2 安装与启动

1、制作安装包 Mycat2不提供安装包,只提供核心JAR包,JAR包可以独立运行,安装包是使用Java Service Wrapper做壳的,如果需要安装包,需要自己制作。JAR可以作为Java库引入自己业务项目中使用Mycat2中的各个组件的设计都是可以独立使用的。 步骤如下: 1.…

【C++干货铺】继承后的多态 | 抽象类

个人主页点击直达:小白不是程序媛 C系列专栏:C干货铺 代码仓库:Gitee 目录 多态的概念 多态的定义和实现 多态的定义条件 虚函数 虚函数的重写 特殊情况 协变(基类和派生类的虚函数返回值不同) 析构函数的重…

ffmpeg踩坑之手动编译报错Unrecognized option ‘preset‘及rtsp/rtmp推流

本文解决的问题记录: 报错1:Unrecognized option preset. Error splitting the argument list: Option not found 报错2:ERROR: x264 not found using pkg-config 报错3:ffmpeg: error while loading shared libraries: libavd…

【linux】Debian不能运行sudo的解决

一、问题: sudo: 没有找到有效的 sudoers 资源,退出 sudo: 初始化审计插件 sudoers_audit 出错 二、可用的方法: 出现 "sudo: 没有找到有效的 sudoers 资源,退出" 和 "sudo: 初始化审计插件 sudoers_audit 出错&q…