我正在使用 SUSE SLES 11 在 POWER7 系统上运行多程序工作负载(基于 SPEC CPU2006 基准测试)。
有时,工作负载中的每个应用程序都会消耗大量内存,并且总内存占用量超过了系统中安装的可用内存 (32 GB)。
我禁用了交换,否则使用交换的进程可能会严重影响测量。我知道通过这样做,内核可能会通过 OOM 杀手杀死一些进程。那完全没问题。问题是我希望被内核杀死的线程以错误条件退出(例如,进程被信号终止)。
我有一个框架可以启动所有进程,然后等待它们使用
waitpid(pid, &status, 0);
即使线程被 OOM 杀手杀死(我知道,因为我在屏幕和 /var/log/messages 中收到一条消息),调用
WIFEXITED(status);
返回一个,然后调用
WEXITSTATUS(status);
返回零。因此,我无法区分进程何时正确完成以及何时被 OOM 杀手杀死。
我做错什么了吗?您是否知道任何方法来检测进程何时被 OOM 杀手杀死。
我发现这篇文章问了几乎相同的问题。但是,由于这是一个旧帖子并且答案并不令人满意,我决定发布一个新问题。