当OOM杀手杀死一个进程时返回代码

时间:2011-08-24 19:13:28

标签: linux out-of-memory waitpid return-code

我正在使用SUSE SLES 11在POWER7系统上运行多程序工作负载(基于SPEC CPU2006基准测试)。

有时,工作负载中的每个应用程序都会消耗大量内存,并且总内存占用量超过系统中安装的可用内存(32 GB)。

我禁用了交换,否则测量可能会对使用交换的进程产生严重影响。我知道通过这样做,内核,通过OOM杀手,可能会杀死一些进程。那很好。问题是我希望内核杀死的线程退出时出现错误(例如,进程被信号终止)。

我有一个启动所有进程的框架,然后使用

等待它们
waitpid(pid, &status, 0);

即使线程被OOM杀手杀死(我知道因为我在屏幕上和/ var / log / messages中收到了消息),所以调用

WIFEXITED(status);

返回一个,然后调用

WEXITSTATUS(status);

返回零。因此,我无法区分进程何时正确完成以及何时被OOM杀手杀死。

我做错了吗?您是否知道有任何方法可以检测OOM杀手何时杀死进程。

非常感谢,

维克多

P.S:我发现this post提出了几乎相同的问题。但是,由于它是一个旧帖子,答案不尽如人意,我决定发一个新问题。

1 个答案:

答案 0 :(得分:7)

Linux OOM杀手通过发送SIGKILL来工作。如果你的进程被OOM杀死,那么WIFEXITED会返回1。

TLPI

  

要杀死所选进程,OOM杀手会发送一个SIGKILL   信号。

所以你应该能够使用以下方法测试:

if (WIFSIGNALED(status)) {
    if (WTERMSIG(status) == SIGKILL)
        printf("Killed by SIGKILL\n");
}