首页/系统/Linux 内核与性能调优速查/cgroup v2 memory.events 事件计数
内存与 OOM58 条

cgroup v2 memory.events 事件计数

记录 low/high/max/oom/oom_kill 等事件累计次数;max 与 oom_kill 增长说明限额曾被打穿,high 增长说明发生过节流。

文件是什么

memory.events 记录某个 cgroup 内存相关事件的累计次数:low、high、max、oom、oom_kill,较新内核还包含 oom_group_kill。它是判断「限额是否被触发过」最直接的证据来源:max 增长说明用量顶到过硬限额,oom_kill 增长说明确实有进程被终止,high 增长说明软限额的节流生效过。配套的 memory.events.local 只统计本组,不含子孙组。

基本信息

接口路径memory.events 与 memory.events.local
字段low、high、max、oom、oom_kill(较新内核含 oom_group_kill)
数值性质累计计数,必须两次采样求差
统计范围events 含子孙组,local 仅本组
配套文件memory.current/peak、memory.stat、memory.pressure
典型用途OOM 复盘、限额是否过紧的判定、告警指标来源

典型使用场景

  • 排查容器是否被 OOM 杀过:看 oom_kill 增量,再与内核日志交叉验证时间点
  • 判断限额是否过紧:high 与 max 持续增长说明长期贴着限额运行
  • 区分事件归属:events 与 local 对比,确认是本组还是子组触发
  • 上线前验证限额:压测后检查事件计数是否符合预期,作为验收项
  • 监控告警设计:以 oom_kill 增长作为高优先级告警,high 增长作为容量预警

查看与对比

查看与对比
cat /sys/fs/cgroup/myapp.slice/memory.events  # 含子组的累计事件
cat /sys/fs/cgroup/myapp.slice/memory.events.local  # 只统计本组自身
watch -n5 'cat /sys/fs/cgroup/myapp.slice/memory.events'  # 观察是否在持续增长
cat /sys/fs/cgroup/myapp.slice/memory.peak  # 配合峰值判断与限额的距离
journalctl -k -g oom --since '-2h' | tail  # 与内核日志交叉验证终止时间
dmesg -T | grep -i 'killed process' | tail  # 查看被终止的进程名与 PID

字段读法

字段含义判读要点
low该组的内存保护濒临失效的次数增长说明 low 保护不足以挡住回收
high超过 memory.high 触发节流的次数增长代表服务曾被压低速度
max触及 memory.max 的次数增长说明硬限额被顶到过
oom进入 OOM 处理流程的次数通常与 max 同步增长
oom_kill实际终止进程的次数只要非零就应复盘,属于事故级信号
事件计数是累计值,回答「最近是否发生」必须两次采样求差。若用监控系统采集,应同时保留原始计数值与差值两条曲线,避免只看绝对值判断现状。
events 包含子孙组的累计事件,所以在多级 slice 结构下,父组数字变大不代表父组自己有问题。定位到具体服务时要看对应子组的文件,或使用 memory.events.local 排除子孙组干扰。

易错点

  • 用累计值判断当前状态:绝对值只反映历史,必须差分才能说明「最近是否发生」
  • 读错统计范围:events 含子孙组而 local 不含,混用会误判责任归属
  • 只盯 oom_kill 忽略 high:软限额节流不杀进程但会显著拖慢服务,同样需要处理
  • 不与业务时间轴对齐:看到事件计数就归因于应用故障,忽略了高峰流量与限额设置的关系
  • 把 OOM 一律当成应用内存泄漏:先比较 memory.peak 与 memory.max 的距离,确认是否限额本身就偏紧

数据来源与参考

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