OOM排查思路
K8S + 容器的云原生生态,改变了服务的交付方式,自愈能力和自动扩缩等功能简直不要太好用。
有好的地方咱要夸,不好的地方咱也要说,真正的业务是部署于容器内部,而容器之外,又有一逻辑层 Pod 。
对于容器和 K8S 不怎么熟悉的人,一旦程序发生了问题,排查问题就是个头疼的问题。
问题描述
事情的主角是 kubevirt 的一个开源项目叫 cdi,它的用途是在虚拟机启动之前将虚拟机的镜像导入到系统盘中。
在使用过程中,我们发现 cdi 在导入数据时会占用大量的内存空间。
而 cdi-controller 在创建 cdi-importer 的 pod 时,默认限定其最高只能使用 600M 的内存,到最后呢,pod 就发生了 OOMKilled
[root@master01 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
importer-wbm-vda 0/1 OOMKilled 1 76s
一、查看 Pod 状态
首先,检查相关 Pod 的状态,确定是否因为内存超限被杀死。
[root@master01 ~]# kubectl describe pod <pod-name> -n <namespace>
定位关键词
如果容器因为 OOM 被杀死,通常会显示如下信息
State: Terminated
Reason: OOMKilled
查看 Events 部分:
如果 Pod 因为内存不足而被 OOM Killer 杀死,你会在事件中看到类似的提示
Warning OOMKilling kubelet, <node-name> Memory cgroup out of memory: Kill process
二、查看容器日志
如果 Pod 被杀死,可以通过查看容器日志,了解容器在发生 OOM 之前的行为。这有助于判断是否存在内存泄漏或内存使用过高的情况
[root@master01 ~]# kubectl logs <pod-name> -n <namespace> --previous
- 使用
--previous参数查看被终止容器的日志。 - 如果容器在 OOM 之前没有记录错误信息,通常表示容器已经用尽了可用内存,导致进程直接被杀死。
三、查看 Kubelet 和 Node 日志
查看 Kubelet 日志
[root@master01 ~]# journalctl -u kubelet -f
或者直接查找与 OOM 相关的日志
[root@master01 ~]# journalctl -u kubelet | grep -i 'oom'
查看 Node 上的 dmesg 日志,确认是否存在 OOM Killer 杀死进程的记录
[root@master01 ~]# dmesg | grep -i 'oom'
四、查看资源限制(CPU 和内存)
确保 Pod 的资源限制配置正确。如果 Pod 的内存限制(memory limit)设置得太低,可能会导致 OOM 错误
[root@master01 ~]# kubectl get pod <pod-name> -n <namespace> -o yaml
检查 resources 配置
resources:requests:memory: "256Mi"cpu: "250m"limits:memory: "512Mi"cpu: "500m"
五、分析容器内存使用
查看容器的内存使用情况,确认容器是否超过了内存限制。可以使用 kubectl top 来查看资源使用情况
[root@master01 ~]# kubectl top pod <pod-name> -n <namespace>
- 该命令会显示容器当前的内存和 CPU 使用情况。
- 比较容器的
memory usage和memory limit,如果容器接近其内存限制,就可能发生 OOM 错误。
六、分析节点内存压力
OOM 错误可能不仅仅是由于容器本身的内存使用高导致的,也可能是因为节点的整体内存资源不足
[root@master01 ~]# kubectl describe node <node-name>
七、检查内存泄漏
如果某个容器频繁 OOM,并且它的内存使用量持续增长,可能是程序中存在内存泄漏
[root@master01 ~]# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- -------cpu-------r b swpd free buff cache si so bi bo in cs us sy id wa st gu1 0 0 3099200 590472 1748204 0 0 3 37 527 1 0 0 99 0 0 00 0 0 3100144 590472 1748244 0 0 0 0 580 501 0 0 100 0 0 00 0 0 3100708 590472 1748244 0 0 0 0 627 478 0 0 100 0 0 00 0 0 3096128 590472 1748244 0 0 0 0 1628 1672 1 1 98 0 0 0
八、设置合理的资源限制
为了避免 OOM 问题的再次发生,确保设置合理的内存请求(requests)和限制(limits)
requests:表示容器启动时需要的最小内存。Kubernetes 会根据requests为容器分配内存,确保容器有足够的资源启动。limits:表示容器可以使用的最大内存。容器使用超过该限制的内存会被 OOM Killer 杀死。
九、缓存问题
通过不断的 Google 搜索,我查到了 kubectl top 得到的内存使用数据原来是这么计算的
memory.usage_in_bytes-total_inactive_file
从这个公式可以看出, kubectl top 得到的内存使用数据原来是包含 cache 的。
正常的 cache 可以提高磁盘数据的读写数据,在读的时候,会拷贝一份文件数据放到内存中,这部分是可回收的,一旦程序内存不足了,会回收部分 cache 的空间,保证程序的正常运行。

可见读文件的缓存,不会影响内存的申请,更别说 OOM,但在写的时候,情况就不一样了
在写的时候,由于进程处理数据的速度,可能会远大于数据落盘的速度,所以为提高格式转化和数据导入的速度,一般会先将转化好的数据存入缓存中,存入缓存后,进程可以立马 return 回去继续下一堆数据的处理,不用傻傻地等待数据全写入磁盘。
而存在于缓存之中的数据,则由操作系统同步写入磁盘,这样一来,数据落盘就变成了一个异步的过程,大大提高了写入的速度。
如果 qemu-img 处理数据的速度远大于 cache 存入磁盘的速度,就会出现内存不足。
相关文章:
OOM排查思路
K8S 容器的云原生生态,改变了服务的交付方式,自愈能力和自动扩缩等功能简直不要太好用。 有好的地方咱要夸,不好的地方咱也要说,真正的业务是部署于容器内部,而容器之外,又有一逻辑层 Pod 。 对于容器和…...
《Spring Framework实战》10:4.1.4.2.详细的依赖和配置
欢迎观看《Spring Framework实战》视频教程 集合 <list/>、<set/>、<map/>和<props/>元素分别设置Java集合类型list、set、map和properties的属性和参数。以下示例显示了如何使用它们: <bean id"moreComplexObject" class&qu…...
网络安全-XSS跨站脚本攻击(基础篇)
漏洞扫描的原理 1.跨站脚本攻击介绍 xss跨站脚本攻击: xSS 全称(Cross site Scripting )跨站脚本攻击,是最常见的Web应用程序安全漏洞之一,位于OWASP top 10 2013/2017年度分别为第三名和第七名,XSS是指攻…...
Git的学习和常见问题
文章目录 1.初始化配置2.新建仓库3.添加和提交文件4.git reset 回退版本5.git diff 查看差异6.git rm 删除文件7.文件 .gitigonre8.克隆远程仓库9.将已有的本地仓库关联到远程仓库10.分支的基本操作11.解决合并冲突配置问题 最近基于GeekHour的视频学习Git,记录了一…...
Flink源码解析之:Flink on k8s 客户端提交任务源码分析
Flink on k8s 客户端提交任务源码分析 当我们需要在代码中提交Flink job到kubernetes上时,需要如何做呢?要引入什么第三方依赖?需要提供什么内容?flink是如何将job提交到k8s上的?经过了什么样的流程,内部有…...
STLG_02_02_MS SQL - SSMS的安装和使用
SQL Server Management Studio (SSMS) 是 Microsoft 提供的一个集成环境,用于管理、开发和维护 SQL Server 数据库和 Analysis Services 数据库。 一、安装 SSMS 下载 SSMS: 访问 Microsoft 官方网站的 SSMS 下载页面。选择适合你操作系统的版本进行下载。SSMS 支持…...
git 常用命令和本地合并解决冲突
目录 一、常用命令 二、本地可视化合并分支解决冲突 一、常用命令 最近,使用mac电脑,无法直接使用小乌龟进行可视化操作,现在记录一些常用命令。 拉取: git clone <git url> 仅拉起某个单独分支: git clo…...
ThinkPHP 8高效构建Web应用-获取请求对象
【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…...
机器人技术:ModbusTCP转CCLINKIE网关应用
在当今自动化生产与智能制造领域,ModbusTCP转CC-LinkIE网关KJ-MTCPZ-CCIES的应用正日益成为提升生产效率、实现设备间高效通信的重要技术手段。这一转换技术不仅打破了不同通信协议间的壁垒,还为机器人产品的应用提供了更为广阔的舞台。ModbusTCP作为一种…...
C语言的语法
C语言的语法与应用探讨 C语言作为一种高效的程序设计语言,自1970年代问世以来,一直在科学计算、系统编程、嵌入式系统等领域中扮演着重要角色。本文将深入探讨C语言的基本语法、数据结构、控制结构以及其在实际应用中的重要性。 一、C语言基础 1.1 数…...
ElasticsearchJavaClient工具类分析
最近升级了Elasticsearch版本,从7.X升级到8.X的变化还是比较大的,原来7版本用的是RestHighLevelClient,8.X弃用RestHighLevelClient转而支持ElasticsearchClient,并且api调用方式经过建造者模式的改造,变成了链式调用。…...
Docker-文章目录
为什么互联网公司离不开Docker容器化,它到底解决了什么问题? VMware下Centos7安装步骤 Windows安装Docker Linux安装Docker Docker快速安装Tomcat 在docker中对MySQL快速部署与初始数据 利用Dockerfile构建自定义镜像 Dockerfile基础指令 Docker…...
docker安装codeserver 运行vite项目(linux)
估计很多人遇到了codeserver安装后执行vite项目 有proxy路径的问题 我这边去掉了路径代理直接端口访问 防火墙记得打开 8089 和 5173端口 code-server路径 服务器ip:8089 项目路径 服务器ip:5173 docker安装codeserver(linux) mkdir -p ~/.config dock…...
Electron快速入门——跨平台桌面端应用开发框架
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...
Delphi+SQL Server实现的(GUI)户籍管理系统
1.项目简介 本项目是一个户籍管理系统,用于记录住户身份信息,提供新户登记(增加)、户籍变更(修改)、户籍注销(删除)、户籍查询、曾用名查询、迁户记录查询以及创建备份、删除备份共8…...
【JavaEE进阶】获取Cookie/Session
🍀Cookie简介 HTTP协议自身是属于 "⽆状态"协议. "⽆状态"的含义指的是: 默认情况下 HTTP 协议的客⼾端和服务器之间的这次通信,和下次通信之间没有直接的联系.但是实际开发中,我们很多时候是需要知道请求之间的关联关系的. 例如登陆⽹站成…...
在macOS上安装Flutter和环境配置
操作系统 Flutter 支持在 macOS 11 (Big Sur) 或更高版本上开发。本指南假定你的 Mac 默认运行 zsh shell。 如果你的 Mac 是 Apple silicon 处理器,那么有些 Flutter 组件就需要通过 Rosetta 2 来转换适配(详情)。要在 Apple silicon 处理器…...
【电子通识】PWM驱动让有刷直流电机恒流工作
电机的典型驱动方法包括电压驱动、电流驱动以及PWM驱动。本文将介绍采用PWM驱动方式的恒流工作。 首先介绍的是什么是PWM驱动的电机恒流工作,其次是PWM驱动电机恒流工作时电路的工作原理。 PWM驱动 当以恒定的电流驱动电机时,电机会怎样工作呢࿱…...
Maven在不同操作系统上如何安装?
大家好,我是袁庭新。Maven是一个重要的工具,还有很多初学者竟然不知道如何安装Maven?这篇文章将系统介绍如何在Windows、macOS、Linux操作系统上安装Maven。 Maven是一个基于Java的项目管理工具。因此,最基本的要求是在计算机上安…...
maven如何从外部导包
1.找到你项目的文件位置,将外部要导入的包复制粘贴进你当前要导入的项目下。 2.从你的项目目录下选中要导入的包的pom文件即可导包成功 注意一定是选中对应的pom文件 导入成功之后对应的pom.xml文件就会被点亮...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...
Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目
应用场景: 1、常规某个机器被钓鱼后门攻击后,我们需要做更高权限操作或权限维持等。 2、内网域中某个机器被钓鱼后门攻击后,我们需要对后续内网域做安全测试。 #Win10&11-BypassUAC自动提权-MSF&UACME 为了远程执行目标的exe或者b…...
C++ Saucer 编写Windows桌面应用
文章目录 一、背景二、Saucer 简介核心特性典型应用场景 三、生成自己的项目四、以Win32项目方式构建Win32项目禁用最大化按钮 五、总结 一、背景 使用Saucer框架,开发Windows桌面应用,把一个html页面作为GUI设计放到Saucer里,隐藏掉运行时弹…...
【R语言编程——数据调用】
这里写自定义目录标题 可用库及数据集外部数据导入方法查看数据集信息 在R语言中,有多个库支持调用内置数据集或外部数据,包括studentdata等教学或示例数据集。以下是常见的库和方法: 可用库及数据集 openintro库 该库包含多个教学数据集&a…...
分布式计算框架学习笔记
一、🌐 为什么需要分布式计算框架? 资源受限:单台机器 CPU/GPU 内存有限。 任务复杂:模型训练、数据处理、仿真并发等任务耗时严重。 并行优化:通过任务拆分和并行执行提升效率。 可扩展部署:适配从本地…...
