有没有办法获得核心转储或能够调试已被 oom-killer 杀死的进程?
或者甚至设置 oom-killer 来尝试使用 ABRT 来终止进程?
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
为您的内存管理恢复一些理智:
- 禁用OOM Killer(放入
vm.oom-kill = 0/etc/sysctl.conf)- 禁用内存过量使用(Put
vm.overcommit_memory = 2in/etc/sysctl.conf)这些设置将使 Linux 以传统方式运行(如果进程请求的内存超过可用内存
请注意,这是一个三元值:malloc()将失败,并且请求内存的进程预计会处理该故障)。
- 0 = "估计我们是否有足够的 RAM"
- 1 =“总是说是”
- 2 =“如果我们没有记忆就说不”
这将迫使应用程序自己处理内存不足,并且它的日志/核心转储/等可能会给你一些有用的东西。
注意:当您的系统内存不足时,您将无法生成新进程!您可能被系统锁定。