有没有办法获得核心转储,或者能够debugging被杀手杀死的进程?
甚至设置杀手锏来试图杀死一个使用ABRT的进程呢?
另一种方法是禁用内存过量使用。
为了让你的memory management恢复一些理智:
- 禁用OOM杀手(把/etc/sysctl.conf中的
vm.oom-kill = 0)- 禁用内存过量使用(将
/etc/sysctl.confvm.overcommit_memory = 2)这些设置将使Linux以传统方式运行(如果进程请求的内存超过可用的
malloc()将失败,并且请求内存的进程需要处理该故障)。请注意,这是一个三元值:
- 0 =“估计内存是否足够”
- 1 =“总是说是”
- 2 =“如果我们没有记忆就说不”
这将迫使应用程序处理耗尽内存本身,并可能是logs/coredump/...可以给你一些有用的东西。
注意:当你的系统内存不足时,你将无法产生新的进程! 您可能被锁在系统外面。
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杀手实际上杀死一个内存占用任务,就会显示这个信息。