Skip to content

Linux系统防止OOM杀进程完整指南

概述

在Linux系统中,OOM (Out Of Memory) Killer是内核的一种防御机制,当系统内存不足时,它会选择性地杀死一些进程以释放内存。本文档详细介绍如何配置系统以防止关键进程被OOM Killer杀死,确保系统核心服务的稳定运行。

核心原理

OOM Killer是Linux内核在系统内存严重不足时的一种自我保护机制,它会根据特定算法选择性地终止进程以释放内存。该机制主要基于以下因素评估进程的"重要性":

  1. 内存使用量
  2. 进程优先级
  3. OOM评分(oom_score)
  4. 运行时间

通过调整这些参数,我们可以控制进程被OOM Killer终止的概率。

防止进程被OOM Killer杀死的方法

1. 调整进程的OOM优先级(oom_score_adj)

bash
# 设置较低的oom_score_adj值(-1000最安全,不会被杀死)
echo -1000 > /proc/[PID]/oom_score_adj

# 查看当前进程的oom_score_adj值
cat /proc/[PID]/oom_score_adj

# 设置中等优先级
echo -500 > /proc/[PID]/oom_score_adj

参数说明

  • 范围:-1000到1000
  • -1000:完全禁止被OOM Killer杀死
  • 0:默认值
  • 1000:最有可能被杀死

2. 使用systemd服务配置

对于使用systemd管理的服务,可以在服务单元文件中设置OOM优先级:

bash
# 编辑服务文件
vi /usr/lib/systemd/system/service-name.service

# 添加以下内容到[Service]部分
[Service]
OOMScoreAdjust=-1000

# 重新加载systemd配置
systemctl daemon-reload

# 重启服务使配置生效
systemctl restart service-name

注意:修改服务配置需要重启才能生效,对关键服务可先采用临时方法。

3. 调整系统级OOM行为

bash
# 修改vm.overcommit_memory参数
echo 2 > /proc/sys/vm/overcommit_memory

# 设置vm.overcommit_ratio
echo 80 > /proc/sys/vm/overcommit_ratio

# 永久保存设置
echo "vm.overcommit_memory=2" >> /etc/sysctl.conf
echo "vm.overcommit_ratio=80" >> /etc/sysctl.conf
sysctl -p

参数说明

  • vm.overcommit_memory:内存超额分配策略
    • 0:启发式超额分配(默认)
    • 1:总是超额分配
    • 2:严格会计模式,不允许超额分配
  • vm.overcommit_ratio:当使用模式2时,允许的内存超额分配百分比

4. 使用cgroups限制内存

bash
# 创建cgroup并设置内存限制
cgcreate -g memory:/mygroup
echo 500M > /sys/fs/cgroup/memory/mygroup/memory.limit_in_bytes

# 将进程加入该cgroup
cgexec -g memory:mygroup command

# 或将现有进程加入cgroup
echo [PID] > /sys/fs/cgroup/memory/mygroup/tasks

5. 使用ulimit限制进程内存使用

bash
# 设置进程的最大内存使用量
ulimit -v [内存大小,KB]

# 查看当前限制
ulimit -v

# 在启动脚本中设置
#!/bin/bash
ulimit -v 2097152  # 限制为2GB
./your_application

6. 监控OOM事件

bash
# 启用OOM killer日志记录
echo 1 > /proc/sys/vm/oom_kill_allocating_task

# 查看OOM日志
dmesg | grep -i "killed process"

# 永久设置
echo "vm.oom_kill_allocating_task=1" >> /etc/sysctl.conf

建议与最佳实践

  1. 根据实际情况,选择最合适的方法或组合使用多种方法来保护重要进程
  2. 合理调整系统资源,避免因过度保护某些进程而导致系统整体响应变差
  3. 对于数据库等内存密集型服务,应同时优化应用配置,减少内存使用
  4. 定期监控系统内存使用情况,建立预警机制

重要提醒:虽然可以防止特定进程被OOM Killer杀死,但根本解决方案是确保系统有足够的内存或优化应用程序的内存使用。

用心记录,持续学习 | CNB