OOM Killer

在 Linux 中,如果某个进程占用内存过高,可能会触发 OOM Killer(Out-of-Memory Killer),系统会自动选择并终止占用内存最多的进程。但默认策略可能不符合需求,我们可以手动调整 OOM Killer 的优先级,让它在内存不足时优先杀掉指定的进程。


1. 查看 OOM Killer 日志

bash
 
dmesg | grep -i "oom"

bash
 
journalctl -k | grep -i "oom"

这会显示哪些进程曾被 OOM Killer 终止。


2. 手动调整进程的 OOM 优先级

每个进程都有一个 OOM Score(分数越高,越容易被 OOM Killer 杀掉),我们可以手动调整它。

(1) 查看进程的 OOM Score

bash
 
cat /proc/[PID]/oom_score
  • 数值越大,越容易被杀掉(范围 0-1000)。

(2) 调整 OOM 优先级

bash
 
echo "[value]" > /proc/[PID]/oom_score_adj
  • value 范围:-1000(几乎不会被杀)到 1000(优先被杀)。

  • 示例(让 PID=1234 的进程更容易被 OOM Killer 杀掉):

    bash
     
    echo 500 > /proc/1234/oom_score_adj
  • 示例(让 PID=1234 的进程尽量不被杀):

    bash
     
    echo -1000 > /proc/1234/oom_score_adj

3. 永久配置 OOM Killer 策略

(1) 使用 systemd 限制服务内存

如果进程是 systemd 管理的服务,可以在 service 文件里设置:

ini
 
[Service]
MemoryHigh=1G      # 内存超过 1G 时限制分配
MemoryMax=1.5G     # 内存超过 1.5G 时强制终止
OOMScoreAdjust=-500 # 调整 OOM 优先级(负值降低被杀概率)

然后重启服务:

bash
 
systemctl daemon-reload
systemctl restart your-service

(2) 使用 cgroups 限制进程组内存

bash
 
# 创建 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(不推荐)

bash
 
sysctl vm.overcommit_memory=2
echo "vm.panic_on_oom=1" >> /etc/sysctl.conf
sysctl -p
  • ⚠️ 危险! 这可能导致系统崩溃,仅用于特殊场景。

posted @ 2025-08-12 17:39  julian_chang  阅读(18)  评论(0)    收藏  举报