获取被 oom-killer 终止的进程的核心转储或调试

获取被 oom-killer 终止的进程的核心转储或调试

有没有什么方法可以获取核心转储,或者能够调试被 oom-killer 杀死的进程?

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

答案1

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

为了恢复内存管理的合理性:

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

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

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

这将强制应用程序自行处理内存不足的问题,并且它的日志/核心转储/等可能会给你一些有用的信息。

更新 #1

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

答案2

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 终止程序实际终止占用大量内存的任务时,就会显示此信息。

相关内容