OOM Killer
在 Linux 中,如果某个进程占用内存过高,可能会触发 OOM Killer(Out-of-Memory Killer),系统会自动选择并终止占用内存最多的进程。但默认策略可能不符合需求,我们可以手动调整 OOM Killer 的优先级,让它在内存不足时优先杀掉指定的进程。
1. 查看 OOM Killer 日志
dmesg | grep -i "oom"
或
journalctl -k | grep -i "oom"
这会显示哪些进程曾被 OOM Killer 终止。
2. 手动调整进程的 OOM 优先级
每个进程都有一个 OOM Score(分数越高,越容易被 OOM Killer 杀掉),我们可以手动调整它。
(1) 查看进程的 OOM Score
cat /proc/[PID]/oom_score
-
数值越大,越容易被杀掉(范围
0-1000
)。
(2) 调整 OOM 优先级
echo "[value]" > /proc/[PID]/oom_score_adj
-
value
范围:-1000
(几乎不会被杀)到1000
(优先被杀)。 -
示例(让 PID=1234 的进程更容易被 OOM Killer 杀掉):
echo 500 > /proc/1234/oom_score_adj
-
示例(让 PID=1234 的进程尽量不被杀):
echo -1000 > /proc/1234/oom_score_adj
3. 永久配置 OOM Killer 策略
(1) 使用 systemd
限制服务内存
如果进程是 systemd
管理的服务,可以在 service
文件里设置:
[Service]
MemoryHigh=1G # 内存超过 1G 时限制分配
MemoryMax=1.5G # 内存超过 1.5G 时强制终止
OOMScoreAdjust=-500 # 调整 OOM 优先级(负值降低被杀概率)
然后重启服务:
systemctl daemon-reload systemctl restart your-service
(2) 使用 cgroups
限制进程组内存
# 创建 cgroup
cgcreate -g memory:my_group
# 限制内存为 1GB
echo "1G" > /sys/fs/cgroup/memory/my_group/memory.limit_in_bytes
# 把进程加入 cgroup
echo [PID] > /sys/fs/cgroup/memory/my_group/cgroup.procs
-
当进程超过限制时,会被
cgroup
终止。
4. 完全禁用 OOM Killer(不推荐)
sysctl vm.overcommit_memory=2
echo "vm.panic_on_oom=1" >> /etc/sysctl.conf
sysctl -p
-
⚠️ 危险! 这可能导致系统崩溃,仅用于特殊场景。