获取/debugging由oom-killer杀死的进程的核心转储

有没有办法获得核心转储,或者能够debugging被杀手杀死的进程?

甚至设置杀手锏来试图杀死一个使用ABRT的进程呢?

    另一种方法是禁用内存过量使用。

    为了让你的memory management恢复一些理智:

    1. 禁用OOM杀手(把/etc/sysctl.conf中的vm.oom-kill = 0
    2. 禁用内存过量使用(将/etc/sysctl.conf vm.overcommit_memory = 2

    这些设置将使Linux以传统方式运行(如果进程请求的内存超过可用的malloc()将失败,并且请求内存的进程需要处理该故障)。

    请注意,这是一个三元值:

    • 0 =“估计内存是否足够”
    • 1 =“总是说是”
    • 2 =“如果我们没有记忆就说不”

    这将迫使应用程序处理耗尽内存本身,并可能是logs/coredump/...可以给你一些有用的东西。

    更新#1

    注意:当你的系统内存不足时,你将无法产生新的进程! 您可能被锁在系统外面。

     echo 1 > /proc/sys/vm/oom_dump_tasks 

    这似乎是你可以让内核在内存不足错误上显示的最大值。

    https://www.kernel.org/doc/Documentation/sysctl/vm.txt

    当内核执行OOM查杀并且包括诸如pid,uid,tgid,vm大小,rss,nr_ptes,swapents,oom_score_adj分数和名称之类的信息时,启用系统范围的任务转储(不包括内核线程)。 这有助于确定为什么OOM杀手被调用,以确定造成它的stream氓任务,并确定为什么OOM杀手select了杀死它的任务。

    如果这个设置为零,这个信息被抑制。 在具有数千个任务的非常大的系统上,转储每个内存状态信息可能是不可行的。 当信息可能不被期望时,这样的系统不应被迫在OOM条件下招致性能损失。

    如果设置为非零,那么只要OOM杀手实际上杀死一个内存占用任务,就会显示这个信息。