当前位置: 首页 > news >正文

云原生之深入解析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:          RunningStarted:      Thu, 10 Oct 2019 11:14:13 +0200Last State:     TerminatedReason:       OOMKilledExit Code:    137Started:      Thu, 10 Oct 2019 11:04:03 +0200Finished:     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 使用率并了解在容器和命名空间中的实际限制。

相关文章:

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

一、前言 使用 Kubernetes 时,内存不足 (OOM) 错误和 CPU 节流是云应用程序中资源处理的主要难题,这是为什么呢?云应用程序中的 CPU 和内存要求变得越来越重要,因为它们与云成本直接相关。通过 limits 和 requests ,可…...

数据结构与算法之递归: LeetCode 93. 复原 IP 地址 (Typescript版)

复原 IP 地址 https://leetcode.cn/problems/restore-ip-addresses/ 描述 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。 例如:“0.1.2.201” 和 “192.…...

json模块与jsonpath详解

数据提取之JSON与JsonPATH JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。 JSON和XML的比较可谓不…...

ubuntu20.04在noetic下编译orbslam2

ubuntu20.04在noetic下编译orbslam2 参考链接1:https://blog.csdn.net/qq_58869016/article/details/128660588 参考链接2:https://blog.csdn.net/dong123456789e/article/details/129693837 在noetic下的安装环境 1.库安装 sudo apt-get update sudo …...

64. 最小路径和

最小路径和 描述 : 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 题目 : LeetCode 64.最小路径和 64. 最小路径和 解析 : class So…...

惰性加载函数(js的问题)

在web开发中,因为浏览器之间的实现差异,一些嗅探工作总是不可避免。 var addEvent function( elem, type, handler ){if ( window.addEventListener ){return elem.addEventListener( type, handler, false );}if ( window.attachEvent ){return elem.…...

jmeter,读取CSV文件数据的循环控制

1、构造csv数据 保存文件时需要注意文件的编码格式 id,name,limit,status,address,start_time 100,小米100,1000,1,某某会展中心101,2023/8/20 14:20 101,小米101,1001,1,某某会展中心102,2023/8/21 14:20 2、在线程组下添加【CSV数据文件设置】元件 3、CSV文件数据的循环控…...

移植LVGL到像素屏,从此玩转像素屏0门槛

硬件方面 先上渲染图 实物图 配置 主控:esp32 micro32 plus主频:240MhzFlash:8MPSRAM:2M 软件方面 众所周知,LVGL是一个十分优秀的图形框架,小到几百kb的单片机,大到Linux都可以运行。既然它…...

stateflow 之图函数、simulink函数和matlab函数使用及案例分析

目录 前言 1. 图函数graph function 2.simulink function 3.matlab function 4.调用stateflow中的几种函数方式 前言 对于stateflow实际上可以做simulink和matlab的所有任务,可以有matlab的m语言,也可以有simulink的模块,关于几种函数在…...

C# 加载本地文件设置应用程序图标

static class Program{[STAThread]static void Main(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Form mainForm new Form1();mainForm.Show();//IntPtr hProcess Process.GetCurrentProcess().MainWindowHandle;// 设置应用程…...

苹果计划将全球1/4的IPhone产能转移至印度

KlipC报道:据相关人士报道,苹果希望在未来2到3年内每年在印度生产超过5000万部iphone,要是该计划得以实现,印度将占领全球iPhone产量的四分之一。 KlipC的分析师Alex Su表示:“此次iPhone15推出是苹果印度制造计划的一…...

el-date-picker 选择一个或多个日期

el-date-picker可选择多个日期 type“dates” 加个s即可 <div><span>el-date-picker选择多个日期</span><el-date-pickertype"dates"v-model"dateList"placeholder"选择一个或多个日期"></el-date-picker></di…...

5个创建在线帮助文档的好方法!

在线帮助文档是企业为用户提供支持服务的重要工具&#xff0c;它能够帮助用户更好地了解和使用产品&#xff0c;提高用户体验。然而&#xff0c;创建一份优秀的在线帮助文档需要掌握一定的技巧和方法。接下来就介绍一下创建在线帮助文档的5个好方法&#xff0c;帮助企业更好地为…...

听GPT 讲Rust源代码--src/tools(14)

File: rust/src/tools/rust-analyzer/crates/cfg/src/lib.rs 在Rust源代码中&#xff0c;rust/src/tools/rust-analyzer/crates/cfg/src/lib.rs这个文件是Rust语言分析器&#xff08;Rust Analyzer&#xff09;的一部分&#xff0c;用于处理和管理条件编译指令&#xff08;Cond…...

arcgis api for js 中使用API的代理页面(跨越配置)

以下仅作为自己阅读官网api的对reques的理解做的备忘笔记。一知半解&#xff0c;仅供参考。 1、获取或者构建第三方代理 官网解释&#xff1a;代理在其自己的 Web 服务器上安装并运行&#xff0c;而不是在 Esri 服务器或安装了 ArcGIS Enterprise 的计算机上安装和运行&#…...

Unity_FairyGUI发布导入Unity编辑器资源报错

Unity_FairyGUI发布导入Unity编辑器资源报错 报错&#xff1a; FairyGUI: settings for Assets/UI/XMUI/XMSubway_atlas0.png is wrong! Correct values are: (Generate Mip Mapsunchecked) UnityEngine.Debug:LogWarning (object) FairyGUI.UIPackage:LoadAtlas (FairyGUI.P…...

1.5【应用开发】缓冲区(二)

二,附加缓冲区 你可以通过分别调用以下函数来附加一个缓冲区(screen_buffer_t类型),以将其与像素图、流或窗口相关联: screen_attach_pixmap_buffer() //用于附加像素图缓冲区 screen_attach_stream_buffers()//用于附加流缓冲区 screen_attach_window_buffers()屏幕附加…...

RTMP流设置超时时间失败

使用FFmpeg(版本是5.0.3&#xff09;将rtmp流作为输入&#xff0c;设置超时时间&#xff08;使用-timeout参数&#xff09;&#xff0c;结果报错&#xff1a;Cannot open Connection tcp://XXX:1935?listen&listen_timeout 通过./ffmpeg -help full 命令查看FFmpeg帮助&am…...

如何一步步让MySQL支撑亿级流量

1 主从读写分离 大部分互联网业务都是读多写少&#xff0c;因此优先考虑DB如何支撑更高查询数&#xff0c;首先就需要区分读、写流量&#xff0c;这才方便针对读流量单独扩展&#xff0c;即主从读写分离。 若前端流量突增导致从库负载过高&#xff0c;DBA会优先做个从库扩容上去…...

MFC CLXHHandleEngine动态库-自定义设置对话框使用

实现的效果如下所示&#xff1a; void CSampleDlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 CSgxMemDialog dlg(180, 100); dlg.SetEnable(true); dlg.SetWindowTitle(_T("自定义对话框")); dlg.AddStatic(1000, //控件资源…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...