3

Linux中:Out of memory: Kill process 29650 (java) score 174 or sacrifice child

 1 year ago
source link: https://blog.51cto.com/u_7883830/5360628
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Linux有一个特性

Linux有一个特性:OOM Killer,一个保护机制,用于避免在​ ​内存​​不足的时候不至于出现严重问题,把一些无关的进程优先杀掉,即在内存严重不足时,系统为了继续运转,内核会挑选一个进程,将其杀掉,以释放内存,缓解内存不足情况,不过这种保护是有限的,不能完全的保护进程的运行。

dmesg | grep java
Out of memory: Kill process 29650 (java) score 174 or sacrifice child
[105744155.799430] Killed process 29650 (java) total-vm:5983924kB, anon-rss:1436948kB, file-rss:0kB, shmem-rss:0kB

 ​linux​​下允许程序申请比系统可用内存更多的内存,这个特性叫Overcommit。这样做是出于优化系统考虑,因为不是所有的程序申请了内存就立刻使用的,当你使用的时候说不定系统已经回收了一些资源了。不幸的是,当你用到这个Overcommit给你的内存的时候,系统还没有资源的话,OOM killer就跳出来了。

 ​内存​​不足,自动查杀了进程,即杀死了项目进程,项目不能启动

这个问题的原因是low memory耗尽。“内核使用low memory来跟踪所有的内存分配,一旦low memory耗尽,就会查杀进程,以保持系统的正常运转。说白了 OOM Killer 就是一层保护机制,用于避免 Linux 在内存不足的时候不至于出太严重的问题,把无关紧要的进程杀掉

当然,如果触发了OOM机制,系统会杀掉某些进程,那么什么进程会被处理掉呢?kernel提供给用户态的/proc下的一些参数:
1./proc/[pid]/oom_adj,该pid进程被oom killer杀掉的权重,介于 [-17,15](具体具体权重的范围需要查看内核确认)之间,越高的权重,意味着更可能被oom killer选中,-17表示禁止被kill掉。

通过2个步骤可以确认,具体权重的范围:

①uname -a查看Linux内核版本

②进入/usr/src/kernels/内核版本/include/linux/oom.h确认具体的权重范围

2./proc/[pid]/oom_score,当前该pid进程的被kill的分数,越高的分数意味着越可能被kill,这个数值是根据oom_adj运算(2ⁿ,n就是oom_adj的值)后的结果。

oom_adj,oom_score是oom_killer的主要参考值

 解决方案(我们能做什么):

1.保护我们重要的进程,避免被处理掉实例:

(获得重要进程的PID)

ps -ef|grep java

(输入-17,禁止被OOM机制处理)

echo -17 > /proc/PID/oom_score_adj

2.关闭OOM机制(不推荐,如果不启动OOM机制,内存使用过大,会让系统产生很多异常数据)echo "vm.panic_on_oom=1" >> /etc/sysctl.confsystcl -p 

vm.panic_on_oom    默认为0开启    为1时表示关闭此功能

等于0时,表示当内存耗尽时,内核会触发OOM killer杀掉最耗内存的进程。

当OOM Killer被启动时,通过观察进程自动计算得出各当前进程的得分 /proc/<PID>/oom_score,分值越高越容易被kill掉。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK