Linux 服务器进程避免 OOM 的方法
问题描述
Linux 内核有个机制叫 OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉。典型的情况是:某天一台机器突然 ssh 远程登录不了,但能 ping 通,说明不是网络的故障,原因是 sshd 进程被 OOM killer 杀掉了(多次遇到这样的假死状况)。重启机器后查看系统日志「/var/log/messages」会发现「Out of Memory: Kill process 1865(sshd)」类似的错误信息。如何防止重要的系统进程触发(OOM)机制而被杀死呢?只需要一招,就可以轻松避免。设置参数「/proc/PID/oom_adj为-17」,可临时关闭 Linux 内核的 OOM 机制。内核会通过特定的算法给每个进程计算一个分数来决定杀哪个进程,每个进程的 OOM 分数可以在「/proc/PID/oom_score」中找到。处理办法1. 方法一:设置参数/proc/PID/oom_adj为-17如何防止mongod被杀,可以这样操作:(1) 编写脚本文件oomadj.sh,内容如下:
Linux 内核有个机制叫 OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉。典型的情况是:某天一台机器突然 ssh 远程登录不了,但能 ping 通,说明不是网络的故障,原因是 sshd 进程被 OOM killer 杀掉了(多次遇到这样的假死状况)。重启机器后查看系统日志「/var/log/messages」会发现「Out of Memory: Kill process 1865(sshd)」类似的错误信息。如何防止重要的系统进程触发(OOM)机制而被杀死呢?只需要一招,就可以轻松避免。设置参数「/proc/PID/oom_adj为-17」,可临时关闭 Linux 内核的 OOM 机制。内核会通过特定的算法给每个进程计算一个分数来决定杀哪个进程,每个进程的 OOM 分数可以在「/proc/PID/oom_score」中找到。处理办法1. 方法一:设置参数/proc/PID/oom_adj为-17如何防止mongod被杀,可以这样操作:(1) 编写脚本文件oomadj.sh,内容如下:
-
!/bin/bash
-
netstat -ntlup |grep mongod |awk '{print$NF}' |awk -F '/' '{print$(NF-1)}' |while read PID;
-
do
-
echo -17 >/proc/$PID/oom_adj;
-
done
-
[root@mnkj-mongodb-01 ~]crontab -e
-
/1 * /root/oomadj.sh
-
sysctl -w vm.panic_on_oom=1
-
vm.panic_on_oom = 1 //1表示关闭,默认为0表示开启OOM
-
sysctl -p
-
Kernel-2.6.26之前版本的 oomkiller 算法不够精确,RHEL 6.x 版本的 2.6.32 可以解决这个问题。
-
子进程会继承父进程的 oom_adj。
-
OOM 不适合于解决内存泄漏(Memory leak)的问题。