找到Linux OOM杀手杀死的进程

Yan*_*ang 155 linux linux-kernel

当Linux内存不足(OOM)时,OOM杀手基于一些启发式选择一个杀死进程(这是一个有趣的读物:http://lwn.net/Articles/317814/).

如何以编程方式确定最近被OOM杀手杀死的进程?

Joh*_*lla 154

试试这个:

grep -i 'killed process' /var/log/messages
Run Code Online (Sandbox Code Playgroud)

  • 你可以使用"egrep -i -r'kill process'/ var/log /"在其他地方搜索它. (35认同)
  • FWIW,我在syslog或kern.log中获取这些消息,但不是/ var/log/messages (16认同)
  • @jberryman:出于某种原因,syslog在某些发行版上的`/ var/log/syslog`中,在其他发行版上是`/ var/log/messages`.我认为前者是Debian,后者是Red Hat,BICBW. (4认同)
  • "dmesg | egrep -i'杀死进程'"你可以在任何地方搜索日志(包括已存档的日志):) (4认同)
  • `egrep`在这里没有意义.普通的老`grep`,或者如果我们具体,`fgrep`,更有意义.(相应地编辑答案.) (2认同)

小智 129

试试这个,这样您就不必担心日志的位置了

dmesg | egrep -i 'killed process'
Run Code Online (Sandbox Code Playgroud)

  • 我还建议使用`dmesg -T`以获得可读的时间戳 (11认同)
  • 不确定您的日志文件,但dmesg的输出来自有限大小的环形缓冲区.如果其他东西已经填满缓冲区,那么你就会失去oom-killer输出. (3认同)
  • 与/ var / log / messages相比,它的优点是不需要root特权 (2认同)

小智 51

现在dstat提供了一个功能,可以在运行的系统中找出哪个进程可以被oom机制杀死

 dstat --top-oom
 --out-of-memory---
  kill score
 java           77
 java           77
 java           77
Run Code Online (Sandbox Code Playgroud)

并按照手册页

  --top-oom
          show process that will be killed by OOM the first
Run Code Online (Sandbox Code Playgroud)

  • 如果不知道分数的含义,这些信息就毫无意义,并且没有在任何地方记录。你可能看到的只是分数增加,然后进程被杀死,所以也许是 oom 杀手,或者可能是其他东西,没有办法确定。 (2认同)

小智 15

试试这个:

grep "Killed process" /var/log/syslog
Run Code Online (Sandbox Code Playgroud)