调整 OOM 倾向
oom_score_adj 在 -1000 到 1000 之间调整进程被 OOM 杀掉的倾向:负值降低被杀概率(保护),正值提高(更可能被牺牲),-1000 表示几乎免疫。注意它调整的是倾向而不是豁免,内存真正耗尽时仍可能被杀。systemd 服务可用 OOMScoreAdjust= 固化设置。当前分数与调整值分别读 /proc/<pid>/oom_score 与 /proc/<pid>/oom_score_adj。
基本信息
| 取值范围 | -1000 到 1000 |
|---|---|
| 查看 | /proc/<pid>/oom_score 与 /proc/<pid>/oom_score_adj |
| systemd 对应 | OOMScoreAdjust=-500 |
| 语义 | 调整被杀倾向,不是绝对豁免 |
| 容器注意 | 还受宿主与 cgroup 层影响 |
典型使用场景
- 保护数据库等关键进程不被优先杀掉
- 让可快速重启的无状态服务更早被牺牲
- 排查 OOM 时选择牺牲者的依据
- 服务化部署时固化调整值
- 容器环境中核对多层设置是否一致
查看与设置
查看与设置
cat /proc/<pid>/oom_score /proc/<pid>/oom_score_adj
echo -500 | sudo tee /proc/<pid>/oom_score_adj
cat /proc/<pid>/oom_score
systemctl show myservice -p OOMScoreAdjust
systemctl set-property myservice.service OOMScoreAdjust=-500
cat /proc/self/oom_score_adj
cat /sys/fs/cgroup/<组>/memory.events # 观察组内 OOM 是否真的发生取值效果
| 取值 | 效果 | 注意 |
|---|---|---|
| 负值(如 -500) | 降低被杀倾向 | 不等于免疫,内存耗尽仍可能被杀 |
| 0 | 默认行为 | 按内存占用等因素计算 |
| 正值(如 500) | 提高被杀倾向 | 适合可快速重启的服务 |
| -1000 | 几乎不会被选中 | 谨慎使用,可能让其他进程先被杀 |
调整只是倾向:内存真正耗尽时仍可能被杀,根治手段是解决泄漏或设置合理的 cgroup 内存限额。
容器内的设置会被宿主 scope 影响,跨层都要核对;只在容器内设置不一定能得到预期的保护效果。
常用取值参考
- 数据库与关键中间件:设为负值降低被杀概率,但不要直接使用极端值
- 无状态且可快速重启的服务:设为正值,让它在内存紧张时更早被牺牲
- 监控与日志代理:一般保持默认,避免关键观测进程被优先杀掉
- 先用压测确认调整效果,再写入服务单元固化
整机 OOM 与容器内被杀是两条路径:cgroup 内存限额触顶时由该控制组选择牺牲者,进程的调整值同样参与打分。