一尘不染

OOM杀手杀死进程时返回代码

linux

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

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

我禁用了交换,因为否则使用交换的过程可能会严重影响测量结果。我知道通过这样做,内核可以通过OOM杀手来杀死某些进程。很好
问题是我希望内核杀死的线程以错误条件退出(例如,进程被信号终止)。

我有一个框架,可以启动所有流程,然后使用

waitpid(pid, &status, 0);

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

WIFEXITED(status);

返回一个,然后调用

WEXITSTATUS(status);

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

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

非常感谢你,


阅读 379

收藏
2020-06-02

共1个答案

一尘不染

Linux OOM杀手程序通过发送起作用SIGKILL。如果您的过程被OOM杀死,则WIFEXITED返回1的结果很糟糕。

TLPI

为了终止选定的进程,OOM终止器发出SIGKILL信号。

因此,您应该可以使用以下方法进行测试:

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