我在云中做了很多工作,运行占用大量内存的统计模型,通常使用 Ubuntu 18.04。让我头疼的一个大问题是,当我设置一个模型运行几个小时或过夜时,我稍后检查它发现进程已被终止。经过一些研究后,这似乎是由于内存不足 (OOM) 杀手造成的。
我想知道 OOM Killer 何时会在发生时立即杀死我的一个进程,这样我就不会花一整夜的时间来购买甚至没有运行任何东西的云虚拟机。
看起来 OOM 事件已记录/var/log/
,所以我想我可以编写一个 cron 作业来定期在 中查找新消息/var/log/
。但这似乎是一个拼凑。有什么方法可以设置 OOM Killer,以便在它杀死进程后,然后运行一个 shell 脚本,我可以配置该脚本来向我发送通知?
答案1
你可以让内核在 oom 时出现恐慌:
sysctl vm.panic_on_oom=1
或用于将来重新启动
echo "vm.panic_on_oom=1" >> /etc/sysctl.conf
您可以调整进程被终止的可能性,但假设您已经删除了大多数进程,因此这可能没有用。请man 5 proc
参阅/proc/[pid]/oom_score_adj
.
当然,您可以测试程序的退出代码。如果它是 137,它就会被 SIGKILL 杀死,这是 oom 可以做到的。
如果使用,rsyslogd
您可以匹配数据流中的 oom 消息(我不知道它是什么形状)并运行程序:
:msg, contains, "oom killer..." ^/bin/myprogram