剖析 Linux 内核虚拟内存 Overcommit 策略、OOM badness 算法,以及如何精准控制进程的 oom_score_adj。

一、 内核 Overcommit 与 OOM 触发策略

在 /etc/sysctl.conf 中调优内存过载限制:

# 0: 启发式过载; 1: 始终允许过载; 2: 拒绝超过 Swap + RAM*ratio 的请求
vm.overcommit_memory = 2
vm.overcommit_ratio = 80

# 触发 OOM 时不进行 Kernel Panic
vm.panic_on_oom = 0

二、 badness 评分与进程豁免配置

# 查看任意进程当前 OOM 评分
cat /proc/$PID/oom_score

# 降低特定核心进程 (如 mysqld/nginx) 被 Kill 的概率
# 范围 -1000 到 1000,-1000 表示彻底禁用 OOM Killer 杀此进程
echo -1000 > /proc/$(pgrep -f mysqld)/oom_score_adj