【问题标题】:Finding which process was killed by Linux OOM killer [closed]查找Linux OOM杀手杀死了哪个进程[关闭]
【发布时间】:2023-04-02 18:59:01
【问题描述】:

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

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

【问题讨论】:

    标签: linux linux-kernel


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • FWIW,我在 syslog 或 kern.log 中收到这些消息,但在 /var/log/messages 中没有
    • 其他地方也可以使用“egrep -i -r 'killed process' /var/log/”搜索。
    • @jberryman:出于某种原因,系统日志在某些发行版上位于/var/log/syslog,而在其他发行版上位于/var/log/messages。我认为前者是 Debian,后者是 Red Hat,BICBW。
    • " dmesg | egrep -i 'killed process' " 你可以在任何地方搜索日志(包括存档的):)
    • egrep 在这里没有意义。普通的旧grep,或者如果我们要具体一点,fgrep,更有意义。 (相应地编辑答案。)
    【解决方案2】:

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

    dmesg -T | egrep -i 'killed process'
    

    -T, --ctime - 打印人类可读的时间戳。

    【讨论】:

    • 这也很有用,但遗憾的是我无法解释它,但我在/var/log/messages 中看到了在dmesg//var/log/dmesg 中没有出现的结果。这可能是某种错误配置,但值得注意的是,使用这两种方法可能是个好主意。
    • 不确定您的日志文件,但 dmesg 的输出来自有限大小的环形缓冲区。如果自 oom-killer 以来其他东西已填满缓冲区,那么您将丢失 oom-killer 输出。
    • 这是我发现如何在 OpenVZ 容器中看到该进程被杀死的唯一方法
    • 相比/var/log/messages,这样的好处是不需要root权限
    • 对我来说它就在 dmesg -T 的底部。我不需要 grep。
    【解决方案3】:

    现在 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 杀手,也可能是其他原因,无法确定。
    【解决方案4】:

    试试这个:

    grep "Killed process" /var/log/syslog
    

    【讨论】:

      猜你喜欢
      • 2019-01-30
      • 2019-12-25
      • 2011-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 2015-06-08
      相关资源
      最近更新 更多