當 Linux 系統記憶體耗盡時,核心會啟動 OOM Killer(Out-of-Memory Killer)機制,強制終止佔用記憶體過大的進程以維持系統存活。本文深入解析 OOM Killer 的觸發條件、分數計算機制、典型故障現象,並提供保護關鍵系統進程(如 SSH、監控代理)不被誤殺的實戰配置方法。

oom_score(0-1000),分數最高者優先被殺掉sshd 進程被 OOM Killer 終止/var/log/messages 會發現:Out of Memory: Kill process 247 (sshd)每個進程的 OOM 分值可在 /proc/ 查看。核心根據以下因素計算:
oom_score_adj / oom_adj 調整值oom_score_adj 為最低值(推薦,Linux 2.6.36+)echo -1000 > /proc//oom_score_adj
值範圍:-1000(完全禁用 OOM)到 1000(最優先被殺)。-1000 等同於關閉該進程的 OOM Killer。
oom_adj(已棄用但仍相容)echo -17 > /proc//oom_adj
值範圍:-17(禁用 OOM)到 15。注意:-17 為特殊值,表示完全不參與 OOM 殺戮。
#!/bin/bash
# protect_sshd.sh - 每分鐘透過 cron 執行
pgrep -f "/usr/sbin/sshd" | while read PID; do
echo -1000 > /proc/$PID/oom_score_adj
done
部署至 crontab:
* * * * * /path/to/protect_sshd.sh
sshd(遠端管理生命線)/proc/sys/vm/panic_on_oomecho 0 > /proc/sys/vm/panic_on_oom # 不觸發 kernel panic,僅殺進程(預設)
echo 1 > /proc/sys/vm/panic_on_oom # 觸發 kernel panic(嚴重環境可考慮)
/proc/sys/vm/oom_kill_allocating_taskecho 1 > /proc/sys/vm/oom_kill_allocating_task # 直接殺發起分配請求的進程,不計算分值
/etc/sysctl.conf 永久生效vm.panic_on_oom = 0
vm.oom_kill_allocating_task = 0
grep -i "out of memory" /var/log/messagessar -r、free -h、topps aux --sort=-%mem | head理解並正確配置 OOM Killer,能在記憶體壓力下保障核心服務存活,是 Linux 系統穩定性建設的關鍵一環。