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

Posted

技术标签:

【中文标题】OOM 杀手杀死进程时返回代码【英文标题】:Return code when OOM killer kills a process 【发布时间】:2011-11-03 02:29:15 【问题描述】:

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

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

我禁用了交换,否则使用交换的进程的测量可能会受到严重影响。我知道通过这样做,内核可能会通过 OOM 杀手杀死一些进程。那完全没问题。问题是我希望内核杀死的线程以错误条件退出(例如,进程被信号终止)。

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

waitpid(pid, &status, 0);

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

WIFEXITED(status);

返回一个,然后调用

WEXITSTATUS(status);

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

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

我发现this post 提出了几乎相同的问题。但是,由于这是一个旧帖子并且答案并不令人满意,我决定发布一个新问题。

【问题讨论】:

WIFSIGNALLED() 怎么样?是假的吗? 【参考方案1】:

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

TLPI

为了杀死选定的进程,OOM 杀手提供一个 SIGKILL 信号。

所以您应该可以使用以下方法进行测试:

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

【讨论】:

这是我的预期,但尝试后它不起作用。 WIFSIGNALED(status) 为所有进程(包括被杀死的进程)返回零。有什么想法吗? @Victor 仅用于测试;尝试用kill(..., SIGKILL) 杀死他们。看看会发生什么。

以上是关于OOM 杀手杀死进程时返回代码的主要内容,如果未能解决你的问题,请参考以下文章

Linux OOM 自动杀死进程

杀死进程时如何执行 logout() ?

任务杀手如何工作?

oom killer

杀进程的三种方式

linux性能优化系统Swap变高原因分析