Linux cgroup v2 内存限流怎么判读:memory.high、memory.max 与 memory.events 实战
线上跑的 worker 服务突然卡慢,很多人第一反应去查宿主机总内存,最后发现宿主机内存根本没占满。这种场景十有八九是服务所在的 cgroup v2 已经碰到了 memory.high,所有任务被迫进入内存回收和限流状态;内存占用接着往上涨的话,才会触到 memory.max,触发 cgroup 内部的 OOM 流程。要是直接把这两个边界混统称成「内存上限」,排障的时候大概率走弯路。
memory.high适合做可观测、可回退的内存节流,不直接触发 OOM killer。memory.max是硬兜底,触顶且无法回收时才可能在该 cgroup 内触发 OOM。memory.events中的high、max、oom、oom_kill要结合时间顺序判断。- 调参前先记录
memory.current、memory.peak和事件计数,回滚时只恢复边界值。
先从症状判断:慢了,还是已经被杀
假设你的服务部署在 /sys/fs/cgroup/demo.slice/worker.service 路径下,先别急着把内存限制直接拉满改成 max,第一时间同时读取当前用量、峰值和事件计数:
cg=/sys/fs/cgroup/demo.slice/worker.service
cat "$cg/memory.current" "$cg/memory.peak"
cat "$cg/memory.high" "$cg/memory.max"
cat "$cg/memory.events"
如果 high 持续增加而 oom_kill 没有变化,优先判定是服务被节流、内存回收压力变大导致的延迟上涨;如果 max、oom 和 oom_kill 一起增长,再去排查具体被终止的进程和当时的请求峰值。

memory.high 和 memory.max 不是同一种上限
用 memory.high 把失控增长变成可观测压力
memory.high 是内存使用的节流边界。用量超过它之后,cgroup 内的所有任务会承受更重的内存回收压力,接口延迟大概率会上升,但这个边界本身不会主动调用 OOM killer。把它设置在服务正常工作集的上限之上,相当于先给服务自动降速,给监控告警和后续扩容留出缓冲时间。
echo 768M > "$cg/memory.high"
echo 1G > "$cg/memory.max"
上面列的数值只是演示示例,不能直接照搬套到生产环境。要先观察一段时间内的 memory.peak,再结合业务峰值、并发量和宿主机剩余资源余量来确定最终值。只设置 memory.max 而没有配套的 memory.high,通常会导致第一次明显告警出现的时候,服务已经离 OOM 非常近了。
用 memory.max 保护整台机器
memory.max 是硬内存限制。达到这个边界之后如果内存回收没法把实际用量压回去,内核会直接在当前 cgroup 内走 OOM 处理逻辑;它不等同于宿主机剩余内存的数值,也不会保证每一次内存分配失败都会立刻表现为完整的进程终止动作。
排查的时候要把三件事分开验证:服务响应是不是真的变慢了、cgroup 内存占用是不是接近硬边界、有没有真的发生 OOM 杀进程动作。只盯着应用日志里的超时报错,没法凑齐这三组完整证据,很容易误判根因。
memory.events 怎么读出真正的因果链
这个事件文件的计数是累计叠加的,单次读取只能告诉你这类事件之前发生过,没法直接给出发生的具体时间点。比较实用的做法是调整任何内存边界之前先存一份基线快照,过几分钟再对比两个快照的增量:
cat "$cg/memory.events" > /tmp/worker-memory-events.before
# 观察一段业务流量后再次读取
cat "$cg/memory.events"
| 字段 | 含义 | 排障动作 |
|---|---|---|
high | 超过 high 边界并发生节流或直接回收 | 核对接口延迟、回收压力和工作集增长情况 |
max | 用量接近或越过 max 边界 | 核对内存峰值、突发请求量和当前限制值 |
oom | 分配接近失败,进入 OOM 状态 | 关联内核日志和对应时刻的进程状态 |
oom_kill | cgroup 内有进程被 OOM killer 终止 | 留存对应时间段的服务日志,确认后续恢复和重启策略 |

一套可回滚的处理步骤
1. 先留证,再改一个边界
提前记录当前的限制值、内存用量、峰值、事件文件快照和对应时间段的服务日志。不要同时修改 high、max、并发配置和缓存大小多组参数,不然就算后面延迟恢复了,你也没法定位到底是哪一项调整起了作用。
2. high 持续增长时先保护请求延迟
如果只是 high 增长,可以先调低 worker 并发数或者暂停非关键的后台批处理任务,再观察 memory.current 有没有回落。确认工作集本身没有继续异常上涨之后,再决定是调高 high 边界、缩减内存缓存占用,还是拆分服务实例。
3. 接近 max 时保留硬兜底
不要为了让服务能继续跑就直接删掉 memory.max 这个硬限制。更稳妥的操作是先把突发流量的来源压下去,确认应用可以正常释放占用的内存之后,再小幅调整 max 数值,接着持续观察 oom 和 oom_kill 的增量变化。
4. 异常扩大后按原值回滚
cat "$cg/memory.high" "$cg/memory.max"
echo 768M > "$cg/memory.high"
echo 1G > "$cg/memory.max"
如果你的服务是由 systemd 托管的,长期生效的配置应该写到 unit 的资源控制项里,通过 systemctl daemon-reload 和服务重载重启的流程正式生效;临时直接写入 cgroup 对应文件的方式只适合应急验证,不能当成永久配置方案。
几个容易混淆的边界
- high 计数上涨不等于 OOM:它大概率只是说明业务正在被内存节流,还没到进程被杀的阶段。
- max 计数上涨不等于已经杀进程:还要看
oom与oom_kill的数值变化。 - events 所有字段都是累计值:发布服务或者调整参数之后要及时保存前后的快照,用增量差值而不是绝对值做判断。
- 层级统计要留意:
memory.events默认会累加所有子 cgroup 的层级事件;如果只想看当前层的事件统计,去检查同目录下对应的memory.events.local文件即可。
相关问题
memory.high 设成和 max 一样的值可以吗?
可以,相当于关掉了提前节流的边界,但这样就失去了提前暴露内存压力的预警信号。生产环境运行的核心服务通常还是要留一个合理的 high 阈值,搭配监控一起使用。
memory.max 触顶一定会杀掉主进程吗?
不一定。会不会最终触发 OOM kill 取决于内存回收是否成功、内存分配的类型和当前 cgroup 内的进程状态,最终判定结果要以事件文件和内核日志的记录为准。
为什么 memory.events 的 high 字段数值一直增加?
说明内存用量多次越过 high 边界,反复触发节流或者直接回收逻辑。先排查业务工作集有没有异常增长,再核对并发数、内存缓存和后台突发任务的运行情况。
systemd 托管的服务应该在哪里配置这两个参数?
直接在对应 unit 的资源控制配置段里设置 MemoryHigh 和 MemoryMax 即可;临时修改 cgroup 文件的操作只适合验证当前问题现象,不能当成长期方案。
Linux cgroup v2 的内存治理可以整理成一条清晰的操作链路:用 memory.high 提前减速留出缓冲,用 memory.events 留存完整事件证据,用 memory.max 做最后兜底保护。排障的时候始终保留参数调整前后的快照,后续处理结果才能复盘、可回滚。
Python asyncio.Queue.shutdown() 如何安全停机:QueueShutDown、join 与 immediate 边界
- 上一篇
- Python asyncio.Queue.shutdown() 如何安全停机:QueueShutDown、join 与 immediate 边界
- 下一篇
- Linux cgroup v2 磁盘 I/O 限流怎么配:io.max、io.stat 与回滚验收
-
- 文章 · linux | 55分钟前 |
- Linux cgroup v2 io.max 设备号怎么核对:NVMe 批处理限速与 io.stat 复测
- 453浏览 收藏
-
- 文章 · linux | 57分钟前 |
- Linux cgroup v2 磁盘 I/O 限流怎么配:io.max、io.stat 与回滚验收
- 353浏览 收藏
-
- 文章 · linux | 1天前 | oom · 内存 · Linux · 运维排查 · cgroup · Linux OOM cgroup v2 memory.events memory.current memory.max memory.high
- Linux cgroup v2 memory.events 怎么看:区分回收、限额与 OOM 的证据链
- 456浏览 收藏
-
- 文章 · linux | 1天前 | Linux · 性能监控 · 系统排查 · 资源压力 · Linux 性能排查 PSI Pressure Stall Information /proc/pressure
- Linux PSI 怎么定位 CPU、内存和 IO 压力:/proc/pressure 与阈值告警实战
- 461浏览 收藏
-
- 文章 · linux | 1天前 | Linux · 运维排查 · 进程管理 · 服务限时 · Linux 服务治理 journalctl RuntimeMaxSec
- Linux RuntimeMaxSec 到点后为什么没退出:服务属性与日志验证
- 389浏览 收藏
-
- 文章 · linux | 1天前 | Linux · 运维排查 · 进程管理 · 服务限时 · Linux 服务治理 journalctl RuntimeMaxSec
- Linux 服务超过 RuntimeMaxSec 怎么验收:运行时限、日志结果与重启边界
- 474浏览 收藏
-
- 文章 · linux | 1天前 | Linux · 网络排障 · Netfilter · Linux conntrack nf_conntrack_max
- Linux conntrack 表满怎么排查:nf_conntrack_count 与 max 的安全处理
- 129浏览 收藏
-
- 文章 · linux | 1天前 | Linux · 故障排查 · 服务隔离 · Linux 临时文件 PrivateTmp /tmp mount namespace
- Linux PrivateTmp 开启后 /tmp 文件去哪了:服务命名空间与排查边界
- 254浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ljg-skills
- ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
- 4947次使用
-
- MELO音乐
- MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
- 4516次使用
-
- UniScribe
- UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
- 4458次使用
-
- 剧云
- 剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
- 4703次使用
-
- 万象有声
- 万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
- 4661次使用
-
- Linux搭建vsftpdFTP服务器教程
- 2026-04-30 501浏览
-
- Shell脚本安装教程:.sh一键安装指南
- 2026-03-16 501浏览
-
- Linux清空文件内容的几种方法
- 2025-12-01 501浏览
-
- Linux命令行下载文件技巧
- 2025-11-23 501浏览
-
- Linuxapt与yum配置技巧全解析
- 2025-09-23 501浏览

