问题描述
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?(2) 设置定时计划
[root@mnkj-mongodb-01?~]crontab?-e?*/1?*?*?*?*?/root/oomadj.sh?
至于为什么用-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机制
#?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)的问题。有时 free 查看还有充足的内存,但还是会触发 oom,是因为该进程可能占用了特殊的内存地址空间。oom killer 是保证系统内存不被个别进程消耗殆尽非常实用的机制,但是在实际工作除了进程运行过多会造成内存占用过高,还有很多其他的因素比如:访问增多、遭受攻击等...
这时我们不仅要使用好 oom killer,更需要关注服务器的资源使用情况,需要完善的实时监控体系,能够对于系统存在问题能够及时的发现并处理,保证业务稳定运行。
读懂这些 你还敢继续忽视网站的url吗?网页设计制作价格一般多少钱?网页设计制作怎样收费?怎么做个人网站?步骤有哪些为什么定制化网站建设更容易得到企业的亲睐呢?外贸网站推广优化阶段要重视搜索引擎收录情况竞价托管是什么?公司做竞价托管有什么作用?【北京网站设计】把握5元素,让页面文字阅读更舒适细数使用低成本建站有哪些劣势?