还在担忧主机进程被OOM 只需一招 即可防止
疑问描画
Linux 内核有个机制叫 OOM killer(Out-Of-Memorykiller),该机制会监控那些占用内存过大,尤其是瞬间很快消耗少量内存的进程,为了防止内存耗尽而内核会把该进程杀掉。
典型的状况是:某天一台机器突然 ssh 远程登录不了,但能 ping 通,说明不是网络的缺点,要素是 sshd 进程被 OOM killer杀掉了(屡次遇到这样的假死状况)。重启机器后检查系统日志「/var/log/messages」会发现「Out of Memory: Kill process1865(sshd)」相似的失误消息。
如何防止关键的系统进程触发(OOM)机制而被杀死呢?只须要一招,就可以轻松防止。
设置参数「/proc/PID/oom_adj为-17」,可暂时封锁 Linux 内核的 OOM机制。内核会经过特定的算法给每个进程计算一个分数来选择杀哪个进程,每个进程的 OOM 分数可以在「/proc/PID/oom_score」中找到。
处置方法
1. 方法一:设置参数/proc/PID/oom_adj为-17
如何防止mongod被杀,可以这样操作:
(1) 编写脚本文件oomadj.sh,内容如下:
(2) 设置定时方案
至于为什么用-17而不用其余数值(自动值为0),这个是由linux内核定义的,检查内核源码可知:
以 linux-3.3.6 版本的 kernel源码为例,门路为「linux-3.6.6/include/linux/oom.h」,阅读内核源码可「oom_adj」的可调值为 15 到 -16,其中 15最大-16 最小,-17 为制止经常使用OOM。「oom_score」为 2 的 N 次方计算进去的,其中 N就是进程的「oom_adj」值,所以「oom_score」的分数越高就越会被内核优先杀掉。
2. 方法二:修正内核参数制止OOM机制
//1示意封锁,默以为0示意开启OOM
留意事项
留意:
OOM killer是保障系统内存不被一般进程消耗殆尽十分适用的机制,然而在实践上班除了进程运转过多会形成内存占用过高,还有很多其余的要素比如:访问增多、遭受攻打等...
这时咱们不只有经常使用好 OOMkiller,更须要关注主机的资源经常使用状况,须要完善的实时监控体系,能够关于系统存在疑问能够及时的发现并处置,保障业务稳固运转。