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

Tra*_*ice 10 dump oom

有没有办法获得核心转储或能够调试已被 oom-killer 杀死的进程?

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

HBr*_*ijn 5

echo 1 > /proc/sys/vm/oom_dump_tasks
Run Code Online (Sandbox Code Playgroud)

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

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 杀手实际杀死占用内存的任务时,就会显示此信息。


小智 5

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

为您的内存管理恢复一些理智:

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

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

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

这将迫使应用程序自己处理内存不足,并且它的日志/核心转储/等可能会给你一些有用的东西。

更新 #1

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

  • 这是一个可怕的想法。系统上运行的大多数软件可能无法正确处理内存分配失败的返回值。这样做会导致几乎永远不会被任何人执行的代码路径运行,在最坏的情况下甚至可能通过运行这些未经测试和意外的代码路径在您的系统上引入安全漏洞。 (2认同)