获取/调试被oom-killer杀死的进程的核心转储


10

是否有任何方法可以获取核心转储或能够调试已被oom-killer杀死的进程?

甚至设置oom-killer尝试使用ABRT终止进程?

Answers:


5

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

要使您的内存管理看起来有些理智:

  1. 禁用OOM Killer(放入vm.oom-kill = 0/etc/sysctl.conf中)
  2. 禁用内存过量使用(vm.overcommit_memory = 2输入/etc/sysctl.conf

这些设置将使Linux以传统方式运行(如果某个进程所请求的内存多于可用内存malloc()将失败,并且期望该内存的进程可以应对该失败)。

请注意,这是一个三进制值:
  • 0 =“估计我们是否有足够的RAM”
  • 1 =“总是说是”
  • 2 =“如果我们没有记忆,请拒绝”

这将迫使应用程序自身处理内存不足的情况,并且可能它的日志/ coredump /等可能为您提供有用的信息。

更新1

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


这是一个可怕的主意。您的系统上运行的大多数软件可能无法正确处理内存分配失败的返回值。这样做将导致几乎任何人都无法执行的代码路径运行,并且在最坏的情况下,甚至可能由于运行这些未经测试和意外的代码路径而在系统上引入安全漏洞。
KJ Tsanaktsidis

4
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杀手,确定导致它的恶意任务,以及确定为什么OOM杀手选择了它要杀死的任务。

如果将其设置为零,则此信息被抑制。在具有数千个任务的超大型系统上,为每个任务转储内存状态信息可能是不可行的。当可能不需要这些信息时,不应强迫此类系统在OOM条件下造成性能损失。

如果将其设置为非零,则无论何时OOM杀手实际杀死内存占用任务,都会显示此信息。

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.