【问题标题】:Detecting that a child process was killed because the OS is out of memory检测到子进程因操作系统内存不足而被杀死
【发布时间】:2020-03-15 00:42:03
【问题描述】:

我正在开发一个大型应用程序,该应用程序产生了许多用于处理各种任务的进程。在某些情况下,由于内存压力,操作系统会杀死我的一个进程。没关系,完全在意料之中,父进程优雅地处理了这个。

我想知道的是找出进程被杀死的原因。如果因为记忆压力而被杀死,我想稍后重生治疗。如果它因任何其他原因而被杀死——例如,因为断言失败或内存访问越界,我想记录并调查。

那么,我的问题是:如何发现子进程因操作系统需要内存而被杀死?

问题适用于:

  • 窗户;
  • MacOS;
  • Linux;
  • (对于奖励积分,我也对 Android 感兴趣,但这不是我的首要任务)。

进程以 root/admin 身份运行。

【问题讨论】:

  • 在某些情况下,由于内存压力,操作系统会杀死我的一个进程。 多么可怕的不可靠配置。如果操作系统决定杀死你的父进程怎么办?人们想知道为什么他们的系统有 9 个 5 的可靠性而不是所需的 5 个 9...
  • 嗯,我们正在与操作系统合作以确保它杀死子进程而不是父进程。但是您还能如何处理操作系统上的内存不足情况呢?
  • 禁用out-of-fuel, err, out-of-memory killer,并禁用内存过量使用,为系统配置适当数量的交换空间,这样操作系统就不必通过告诉进程谎言它可以使用所有这些内存,然后在进程胆敢实际使用内存操作系统说它可以时杀死它。 “哎呀,对不起,我谎报关于你可以使用多少内存!HAAA HAAA!你DEAD!!!”是如果你想要可靠性,那就太糟糕了。
  • 啊,这就是现在所有用户操作系统的工作方式。我不会为此写一个新的操作系统:)
  • 啊,好吧,这就是现在所有用户操作系统的工作方式。 不,不是。您实际上可以将系统配置为可靠。首先,您在您所谓的“用户操作系统”上运行生产流程做什么?

标签: c++ windows macos unix memory


【解决方案1】:

在 Linux 上,您可以阅读syslog 以了解进程是否被操作系统杀死。您可以通过阅读syslog(某些发行版上的/var/log/messages 或/var/log/syslog)或通过dmesg 命令来调查它。 如果您生成了该进程,您还可以检测到它被SIGKILL(9) 信号杀死,而不是对应于应用程序自行崩溃的SIGSEGV(11) 信号,SIGINT(2)/SIGTERM(15) 这意味着应用程序被要求正常终止。

关于Windows,我只知道可以通过Application Event Log启用这种类型的监控。有一个GUI Application 可以帮助您进行设置。

【讨论】:

  • 您无法保证在进程被 SIGKILLed 之前消息将在 syslog 中,事实上,大多数 syslogger 会故意延迟单个消息刷新到 syslog 以合并重复的消息。这不会可靠地工作。
  • 我对不立即更新文件感到满意。我对这些文件并不总是存在或可读性有点紧张。但是,是的,如果我没有找到更好的解决方案,我一定会看看这个,谢谢!
  • 这就是检测SIGKILL(9)如此重要的原因。
  • 但我认为我不能确定SIGKILL 表示内存不足,对吧?
  • 另外,@Shloim 关于您将 wrt 添加到 GUI 应用程序 - 谢谢。我对 GUI 解决方案不感兴趣,但如果我能找到此应用程序使用的数据,我会挖掘。
【解决方案2】:

当操作系统为了杀死进程而干预进程的执行时,它会通过信号来执行此操作。

您可以做的(在基于 IX 的/类似平台上)是 -- dmesg。

它输出内核活动日志。 从那里,您可以识别发送到您的进程的信号。

例如下面这段代码--

#include <stdio.h>
int main (void)
{
    char *p = NULL;

    printf ("\n%c", *p);
    return 0;
}

导致这个从 dmesg 获得 --

[8478285.606105] crash.out[16830]: segfault at 0 ip 0000000000400531 sp 00007fffc373b090 error 4 in crash.out[400000+1000]

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多