oom内存溢出进程被杀处理办法

1.由于系统内存不够用,导致一些重要进程被杀
2.修改进程oom的优先级
# 这个接口就是/proc/pid/oom_adj, 它的范围是-17~+15,值越高,就越容易被杀掉,如果把该值设置为-17,oom就永远也不会考虑杀它。
​
cat oom_setting.sh  #使用cron定时执行这个脚本
#!/bin/bash
# 【重要服务不杀 -17cat /data/mysql/mysql_master/data/mysql.pid && echo -17 > /proc/`cat /data/mysql/mysql_master/data/mysql.pid`/oom_adj
cat /data/mongodb/mongodb_master/pid_mongod.pid && echo -17 > /proc/`cat /data/mongodb/mongodb_master/pid_mongod.pid`/oom_adj
cat /data/mysql/mysql_slave/data/mysql.pid && echo -17 > /proc/`cat /data/mysql/mysql_slave/data/mysql.pid`/oom_adj
​
# 【不重要且占用较多内存可停服务,可优先被杀 15,释放内存,找维护时间再处理】
cat /data/mongodb/mongodb_slave/pid_mongod.pid && echo 15 > /proc/`cat /data/mongodb/mongodb_slave/pid_mongod.pid`/oom_adj
3.oom原理说明
在Linux中当malloc返回的是非空时,并不代表有可以使用的内存空间。Linux系统允许程序申请比系统可用内存更多的内存空间,这个特性叫做overcommit特性,这样做可能是为了系统的优化,因为不是所有的程序申请了内存就会立刻使用,当真正的使用时,系统可能已经回收了一下内存。但是,当你使用时Linux系统没有内存可以使用时,OOM Killer就会出来让一些进程退出。
Linux下有3种Overcommit的策略(参考内核文档:vm/overcommit-accounting),可以在/proc/sys/vm/overcommit_memory配置(取0,1和2三个值,默认是0)。 
(10:启发式策略,比较严重的Overcommit将不能得逞,比如你突然申请了128TB的内存。而轻微的overcommit将被允许。另外,root能Overcommit的值比普通用户要稍微多
(21: 永远允许overcommit,这种策略适合那些不能承受内存分配失败的应用,比如某些科学计算应用。 
(32: 永远禁止overcommit,在这个情况下,系统所能分配的内存不会超过swap+RAM*系数(/proc/sys/vm/overcmmit_ratio,默认50%,你可以调整),如果这么多资源已经用光,那么后面任何尝试申请内存的行为都会返回错误,这通常意味着此时没法运行任何新程序。

 

 

 

posted @ 2021-11-17 20:42  chenjianwen  阅读(379)  评论(0编辑  收藏  举报