首页/系统/Linux 内核与性能调优速查/cgroup v2 memory.oom.group 整组终止
内存与 OOM58 条

cgroup v2 memory.oom.group 整组终止

设为 1 时该 cgroup 发生 OOM 会整组一起被终止,避免组内部分进程死亡留下的不一致状态,适合不可分割的工作负载。

接口是什么

memory.oom.group 决定该 cgroup 发生内存不足时如何处理成员进程:设为 1 表示组内进程作为整体一起被终止,默认值 0 只终止触发 OOM 的那个任务。容器场景通常需要整组终止——只杀一个进程往往留下半死不活的依赖进程,形成不一致状态,或让控制器反复重启单组件而不是干净重启。

基本信息

接口路径/sys/fs/cgroup/<组>/memory.oom.group
取值0(默认,只杀触发的那个任务)/ 1(整组终止)
systemd 对应MemoryOOMGroup=1(较新版本提供)
配套接口memory.max(边界)、memory.events(oom 与 oom_kill 计数)
触发前提需要有明确的限额边界,否则组级 OOM 很少发生
适用范围容器、生命周期一致的成组进程

典型使用场景

  • 容器或 Pod:OOM 时整组退出,交给编排系统干净地重建
  • 多进程服务(主控 + worker):避免只杀掉 worker 留下主控空转
  • 批处理作业:整组终止以避免残留进程继续占用资源
  • 验证重启行为:确认 OOM 后是整组消失而不是留下孤儿进程
  • 与监控联动:用 memory.events 的 oom_kill 增长触发告警与复盘

查看与设置

查看与设置
cat /sys/fs/cgroup/myapp.slice/memory.oom.group  # 当前设置
cat /sys/fs/cgroup/myapp.slice/memory.events  # 其中的 oom 与 oom_kill 计数
echo 1 | sudo tee /sys/fs/cgroup/myapp.slice/memory.oom.group  # 开启整组终止
systemctl set-property myapp.service MemoryOOMGroup=1  # systemd 侧设置(版本较新)
dmesg -T | grep -i -m5 oom  # 从内核日志确认终止了哪些进程
journalctl -k -g oom --since '-1h'  # 回溯近一小时内的 OOM 事件

取值对照

取值终止范围适用场景
0仅触发 OOM 的单个任务组内进程相互独立、希望尽量保留服务的场景
1该 cgroup 内的全部进程容器与生命周期一致的多进程服务
整组终止会把同组内健康的进程一并带走。把不相关的服务混在同一个 cgroup 里时这个行为尤其危险,组划分应尽量与服务的生命周期一致。
反过来,如果容器场景不开启该选项,容易出现「只有一个 worker 被杀、其他进程卡在不可用状态」的中间状态,表现为服务半死而非重启,排查时容易被误判为应用 bug。

易错点

  • 混布服务开启整组终止:健康进程被连带杀死,故障范围被放大
  • 没有 memory.max 之类的边界:组级 OOM 难得触发,设置了也看不到效果
  • 只看内核日志不看 memory.events:事件计数更适合做告警,日志容易漏采
  • 以为开启就必然整组:子组边界与委派(delegation)结构会影响实际终止范围,需要实测确认
  • 在 cgroup v1 环境套用该接口:v1 的对应机制是 memory.oom_control,行为与语义并不相同

数据来源与参考

  • Linux 内核 Documentation/admin-guide/cgroup-v2.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌