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

bet*_*ido 6 linux out-of-memory return-code waitpid

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

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

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

我有一个框架,启动所有进程,然后等待使用它们

waitpid(pid, &status, 0);
Run Code Online (Sandbox Code Playgroud)

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

WIFEXITED(status);
Run Code Online (Sandbox Code Playgroud)

返回一个,然后是通话

WEXITSTATUS(status);
Run Code Online (Sandbox Code Playgroud)

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

我做错了吗?你知道如何检测一个进程被OOM杀手杀死的时间.

非常感谢你,

胜利者

PS:我发现这篇文章提出了几乎相同的问题.但是,由于这是一个老帖子,答案不尽如人意,我决定发一个新问题.

cni*_*tar 7

Linux OOM杀手通过发送工作SIGKILL.如果你的进程被OOM杀死,它就会变成WIFEXITED1.

TLPI

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

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

if (WIFSIGNALED(status)) {
    if (WTERMSIG(status) == SIGKILL)
        printf("Killed by SIGKILL\n");
}
Run Code Online (Sandbox Code Playgroud)