有没有什么方法可以获取核心转储,或者能够调试被 oom-killer 杀死的进程?
或者甚至设置 oom-killer 来尝试使用 ABRT 终止进程?
答案1
为了恢复内存管理的合理性:
- 禁用 OOM Killer(放入
vm.oom-kill = 0
/etc/sysctl.conf)- 禁用内存过量使用(
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 终止程序实际终止占用大量内存的任务时,就会显示此信息。