在使用 SIGKILL 杀死程序之前,如何防止重复的 malloc 减慢系统速度直至停止?

在使用 SIGKILL 杀死程序之前,如何防止重复的 malloc 减慢系统速度直至停止?

显然我通常不跑步:

#include <stdlib.h>
int main() {
    while (malloc(50));
    return 0;
}

但我一直在尝试编译大型项目。运行时cmake,我的计算机的资源会耗尽,并且会减慢我的计算机的速度,使其在几分钟内无法使用。然后突然我的电脑再次响应并cmakeSIGKILL.解决方案是cmake通过运行-j2来限制作业数量。

然而,在运行上面所示的简单“内存耗尽”程序后,我惊讶地发现我的系统首先过载。根据手册页malloc(),如果没有可用内存则malloc简单地返回0。为什么我的系统无法识别内存问题并选择malloc失败?

换句话说,我正在寻找一种方法来配置我的系统,以便程序无法占用所有内存,从而导致我的系统缓慢停止。同样,有没有办法将调度程序设置为始终优先考虑我的 DE?

我正在使用 KDE 运行 linux 5.6.6.arch1-1 x86_64。谢谢。

答案1

根据 malloc() 的手册页,如果没有可用内存,则 malloc 只是返回 0。

它是这样指定的,在这种情况下您的代码将退出。但似乎被抢先了。

Linux 有一个 OOM(内存不足)杀手,可以识别恶意进程、杀死它们并记录其所做的事情。但它尽量不要过早处决。

众所周知,礼貌的应用程序会询问系统其配置并相应地调整其行为。显然,cmake不是其中之一。

答案2

听起来你的系统在 RAM 不足时开始交换到磁盘。这会减慢速度,因为磁盘比 RAM 慢几个数量级。在某些时候,虚拟内存也会耗尽,Linux 的内存不足杀手就会启动,选择一个它认为是恶意进程的进程并将其杀死(这就是您看到的 SIGKILL)。这可确保系统保持可用。

您可以限制进程可用的 RAM 量来防止这种情况发生。例如,将 CMake 可用的内存量限制为 100 MB:

ulimit -v 100000
cmake <args>

请注意,您可以为 RAM (-m) 和虚拟内存 (-v) 设置单独的限制。请注意,如果没有可用内存,malloc()将返回空指针。编写良好的软件应该理智地处理这个问题,而其他软件在取消引用空指针时可能会因分段错误而死亡。

相关内容