![在 OOM killer 日志中查看完整的程序命令行参数](https://linux22.com/image/647757/%E5%9C%A8%20OOM%20killer%20%E6%97%A5%E5%BF%97%E4%B8%AD%E6%9F%A5%E7%9C%8B%E5%AE%8C%E6%95%B4%E7%9A%84%E7%A8%8B%E5%BA%8F%E5%91%BD%E4%BB%A4%E8%A1%8C%E5%8F%82%E6%95%B0.png)
是否可以在 OOM killler 日志中查看完整的程序命令行参数?我现在在 /var/log/syslog 中看到的是
Memory cgroup out of memory: Kill process 29187 (beam.smp) score 998 or sacrifice child
Killed process 29302 (cpu_sup) total-vm:4300kB, anon-rss:76kB, file-rss:272kB
beam.smp invoked oom-killer: gfp_mask=0xd0, order=0, oom_score_adj=0
beam.smp cpuset=/ mems_allowed=0-3
我的机器上有大量 beam.smp 进程,找出哪个特定进程被 OOM killer 杀死并不是很方便。
答案1
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 终止程序实际终止占用大量内存的任务时,就会显示此信息。
答案2
echo 1 > /proc/sys/vm/oom_dump_tasks
对我没有太大帮助——日志中仍然没有命令行参数。
要回顾性地查看被杀死进程的命令行,你可以使用在顶上记录系统活动。
如果 oom-killer 杀死了 s/th,只需打开当时的顶部日志,从 /var/log/syslog 中通过 PID 找到您的进程,然后按“c”键查看进程的命令行。