查找哪个进程被Linux OOM杀手杀死了


172

当Linux内存不足(OOM)耗尽时,OOM杀手根据一些启发式方法选择一个要杀死的进程(这很有趣:http : //lwn.net/Articles/317814/)。

如何以编程方式确定OOM杀手最近杀死了哪些进程?

Answers:


171

试试看:

grep -i 'killed process' /var/log/messages

18
FWIW,我在syslog或kern.log中获得了这些消息,但未获得/ var / log / messages
jberryman 2011年

36
您也可以使用“ egrep -i -r'killed process'/ var / log /”在其他位置搜索它。
metdos 2011年

5
@jberryman:由于某些原因,/var/log/syslog某些发行版中的syslog也存在/var/log/messages。我认为前者是Debian,后者是BICBW。
Tom Anderson

5
“ dmesg | egrep -i'killed process'”,您可以在任何地方搜索日志(包括归档的日志):)
John D

2
egrep这里没有意义。普通的grep,或者如果我们要特定的话,fgrep则更有意义。(相应地编辑答案。)
antak

148

试试这个,这样您就不必担心日志在哪里

dmesg | egrep -i 'killed process'

1
这也很有用,但不幸的是我无法解释,但我看到的结果/var/log/messages并未显示在dmesg/中/var/log/dmesg。可能是某种形式的错误配置,但值得注意的是,同时使用这两种方法可能是一个好主意。
kungphu'3

3
不确定您的日志文件,但dmesg的输出来自有限大小的环形缓冲区。如果自oom-killer以来其他东西已填满缓冲区,那么您将失去oom-killer输出。
丹·普里兹

这是我发现如何看到该进程在OpenVZ容器中被杀死的唯一方法
igo

16
我也建议您使用dmesg -T以获得可读的时间戳
gukoff

2
与/ var / log / messages相比,它具有不需要root特权的优点
Kineolyan

52

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

dstat --top-oom
 --out-of-memory---
  kill score
 java           77
 java           77
 java           77

并按手册页

  --top-oom
          show process that will be killed by OOM the first

如果不知道分数的含义,则此信息将毫无意义,并且任何地方都没有记录。您可能会看到的是分数增加,然后是进程被杀死,所以也许是oom killer,或者也许是其他东西,无法确定。
劳伦特

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.