1、当内存严重不足时,内核有两种选择:1.直接panic2.杀掉部分进程,释放一些内核。
2、对于每个进程都有一个oom_score的属性(/proc/PID/oom_score),oom killer会杀死oom_score较大的进程,当oom_score为0时禁止内核杀死该进程。对过设置/proc/PID/oom_adj可以改变oom_score,oom_adj的范围为【-17,15】,当oom_adj=-17时,oom_score将变为0。oom_adj的可调值为15到-16,其中15最大-16最小,-17为禁止使用OOM。oom_score为2的n次方计算出来的,其中n就是进程的oom_adj值,所以oom_score的分数越高就越会被内核优先杀掉。
3、综上,可以通过命令 echo 0 > /proc/PID/oom_adj 来防止进程被oom_killer杀死。
4、涉及到的参数如下:(1)、panic_on_oom 当OOM的时候,是否panic 当值为0的时候,在OOM的时候会调用OOM Killer,大部分情况下,会杀掉导致OOM的进程,然后系统恢复 当值为1的时候,发生了OOM以后,如果有mempolicy/cpusets的进程限制,而这些nodes导致了内存问题的时候,OOM Killer会干掉这些中的一个,系统也会恢复 当值为2的时候,OOM后必然panic
5、(2)、oom_kill_allocating_task 决定在oom的时候,oom killer杀哪些东西。 非0的时候,它会扫描进程队列,然后将可能导致内存溢出的进程杀掉,也就是占用内存最大的那个,但是设置为0的时候,它只杀掉导致oom的那个进程,避免了进程队列的扫描,但是释放的内存大小有限
6、(3)、oom_dump_tasks 当oom killer被引发的时候,将进程的信息输出,包括pid、uid、tgid、vm、rss、cpu等 默认为0