首页/系统/Linux 内核与性能调优速查/oom_score_adj 调整 OOM 倾向
内存与 OOM58 条

oom_score_adj 调整 OOM 倾向

在 -1000..1000 范围调整进程被杀倾向:负值降低(保护),正值提高(可牺牲);systemd 服务可用 OOMScoreAdjust 固化。

调整 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 内存限额触顶时由该控制组选择牺牲者,进程的调整值同样参与打分。

易错点

  • 以为负值等于豁免:极端情况下仍会被杀,需要配合限额与监控
  • 只在一个层次设置:宿主、cgroup 与进程三层的取值都会影响最终结果
  • 给所有服务都设保护:等于没有优先级区分,保护失去意义
  • 忘记持久化:运行时写入重启失效,应写进服务单元
  • 用 oom_score_adj 代替容量规划:只调整被杀顺序,不解决内存不足

数据来源与参考

  • Linux 内核 Documentation/filesystems/proc.rst(oom_score_adj)
  • systemd.exec 手册
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌