当前位置:首页 > 文章列表 > 文章 > linux > Linux cgroups v2 内存限制怎么验证:memory.high、memory.max 与 OOM 事件逐项核对

Linux cgroups v2 内存限制怎么验证:memory.high、memory.max 与 OOM 事件逐项核对

来源:17golang原创 2026-08-26 23:11:10 0浏览 收藏

服务明明没有把宿主机内存吃满,容器却突然退出,日志里还出现了 OOMKilled。这类问题通常不是“机器没内存”这么简单,而是进程撞上了自己所在 cgroup 的限制。cgroups v2 里,memory.highmemory.maxmemory.events 各自记录不同层次的压力,必须放在同一条证据链里看。

先看 memory.current 与两个阈值的关系,再用 memory.events 判断是回收/限速还是触发了硬上限;只有看到 oom_kill 增长,才能确认 cgroup 内发生过 OOM 杀进程。

要点速览
  • memory.high 是压力线,超过后会回收并可能让任务变慢,不等于立即杀进程。
  • memory.max 是硬上限;无法回收时才会进入 cgroup OOM 路径。
  • memory.current 要和 memory.events 的计数一起读取,单看某一刻的数值不够。
  • 复查时保留限制文件、事件计数和进程退出时间,避免把宿主机指标当成容器证据。

先把 cgroups v2 的三条内存证据放到一起

下面以一个名为 demo-worker 的层级说明。实际环境中,Docker、containerd 或服务管理器可能把服务放在更深的目录里,先确认进程的 cgroup 路径,再读取对应目录。

cat /proc/$(pgrep -n demo-worker)/cgroup
cg=/sys/fs/cgroup/demo-worker
cat "$cg/memory.current" "$cg/memory.high" "$cg/memory.max"
cat "$cg/memory.events"

memory.current 是当前用量,memory.high 是触发内存压力控制的边界,memory.max 是不可突破的硬限制。文件显示 max 时表示该层级没有设置对应上限;它不代表整个主机没有上限。

Linux cgroups v2 内存限制阶梯:memory.current 接近 memory.high 后进入压力控制,超过 memory.max 才进入硬上限路径
把当前用量、压力线和硬上限放在同一条判断路径。
文件它回答的问题不要误读成
memory.current现在用了多少内存已经发生 OOM
memory.high何时进入压力控制达到后必然杀进程
memory.max该层级的硬上限宿主机总内存
memory.events压力与 OOM 事件是否累计发生当前瞬时用量

memory.high 超过后,为什么进程只是变慢

当用量越过 memory.high,内核会对该 cgroup 施加内存压力控制,任务可能在分配内存时被延迟,并触发回收。它更像“限速线”,不是直接的 kill 开关。因此,接口延迟突然拉高但进程仍然存活时,先看这条线和 high 计数。

awk '$1 ~ /^(high|max|oom|oom_kill)$/ {print}' "$cg/memory.events"
cat "$cg/memory.pressure"

如果 high 持续增加,而 oom_kill 不变,现象更接近回收和节流。这里别急着把 memory.high 调大:先确认工作负载是否存在缓存无界增长、批量读取没有分段,或子进程没有退出。

memory.max 与 OOM 事件如何交叉验证

当回收无法把用量压回 memory.max 以下,cgroup 才会进入 OOM 处理。此时应保存事件计数和应用日志,而不是只凭一次 docker ps -a 的退出状态下结论。

before=$(awk '$1=="oom_kill" {print $2}' "$cg/memory.events")
date -Is
cat "$cg/memory.current" "$cg/memory.max"
cat "$cg/memory.events"
printf 'oom_kill_before=%s\n' "$before"

重点看 oomoom_killoom_group_kill 是否增长。不同内核版本和工作负载下,事件字段的具体组合可能不同,但 oom_kill 增长是确认“cgroup 杀过进程”的关键证据。把这次输出和服务退出时间对齐,才能排除应用自己调用 exit、健康检查失败或上层编排器重启。

Linux cgroups v2 事件核对路径:先比较 memory.current 与 memory.max,再检查 memory.events 中 high 和 oom_kill 的变化
事件计数负责说明发生过什么,当前值负责说明现在有多满。

一套适合线上复盘的检查顺序

  1. 确认层级:从目标 PID 的 /proc/PID/cgroup 找到实际 cgroup 目录,避免读取了父层或另一个容器的指标。
  2. 记录阈值:保存 memory.highmemory.max 与采样时间;不要把 max 当成无限资源承诺。
  3. 记录当前值:连续采样 memory.current,观察是否在回收后下降,还是一直贴着硬上限。
  4. 核对事件:前后对比 memory.eventshigh 增长提示压力控制,oom_kill 增长才支持 OOM kill 判断。
  5. 对齐上层记录:把事件时间与应用日志、容器退出原因、编排器重启记录对齐,再决定是降峰、修复泄漏还是调整限制。

调整参数前,先把采样结果保存到故障单。否则重启容器后事件计数可能随层级销毁而丢失,之后只能凭印象争论“到底是不是内存杀”。

cgroups v2 内存限制常见问题:看懂数字,却看错了对象

宿主机 free 还有很多,为什么容器仍会被杀?

宿主机可用内存和 cgroup 上限是两套边界。容器可以在主机还有余量时先撞上自己的 memory.max

memory.high 增长是不是 OOM?

不是。它更常说明任务经历了内存压力控制。需要继续看 oom_kill 等事件是否增长。

把 memory.max 调大就能解决吗?

不一定。若根因是缓存或批处理无界增长,调大只会推迟故障,还可能把压力转移给宿主机。先用采样确认增长对象。

结论:用“阈值、当前值、事件计数”闭环判断

cgroups v2 的排查重点不是背参数,而是让三类证据互相印证:阈值说明边界,memory.current 说明此刻的占用,memory.events 说明压力和 OOM 是否累计发生。这样才能把“服务变慢”“容器重启”和“cgroup 杀进程”分成三个不同问题,后续的容量调整才有依据。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Go io.Pipe 如何把压缩输出直接接到上传请求Go io.Pipe 如何把压缩输出直接接到上传请求
上一篇
Go io.Pipe 如何把压缩输出直接接到上传请求
浏览器 Cookie Store API 怎么监听登录态变化:change 事件、页面刷新与降级处理
下一篇
浏览器 Cookie Store API 怎么监听登录态变化:change 事件、页面刷新与降级处理
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • ljg-skills -
    ljg-skills
    ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
    5291次使用
  • MELO音乐 - AI 音乐生成平台,支持多模态创作能力
    MELO音乐
    MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
    4807次使用
  • UniScribe - AI 免费在线音视频转文字平台
    UniScribe
    UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
    4751次使用
  • 剧云 - 免费 AI 智能中文剧本创作平台
    剧云
    剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
    5016次使用
  • 万象有声 - AI 一站式有声内容创作平台
    万象有声
    万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
    4958次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码