Linux 在物理内存不足时总是挂起

Linux 在物理内存不足时总是挂起

我正在使用内核ArchLinux3.18.6-1当软件使用超过物理内存时(当使用的总内存> 5.8GB时),它总是滞后,无响应,我所能做的就是重置计算机。我已经提供了足够大swap/etc/fstab

/swapfile swap swap defaults 0 0

我的vm.swappiness1,命令的输出free -m

              total        used        free      shared  buff/cache   available
Mem:           7800        3059         688         239        4053        4204
Swap:         10247           0       10247

我尝试将交换性增加到10,然后运行一个占用内存的程序munch。C 但当达到4000MB左右时它总是挂起

我的 Linux 出了什么问题?

或者有没有办法自动杀死内存使用量最大的程序? (这可能是最近运行的程序,也就是valgrind我最近的测试程序)

答案1

我已经尝试过echo 1 | sudo tee /proc/sys/vm/oom_kill_allocating_task,但它仍然会滞后几分钟才能真正杀死有问题的程序。在我的测试中,这earlyoom是最适合这种情况的,要安装它,只需输入:

yaourt --needed --noconfirm -S --force earlyoom
sudo cp /usr/bin/earlyoom /usr/local/bin/
sudo systemctl enable earlyoom
sudo systemctl start earlyoom

现在尝试再次编译并运行该程序:

echo '
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv) {
    int max = -1;
    int mb = 0;
    char* buffer;
    if(argc > 1) max = atoi(argv[1]);
    while((buffer=malloc(1024*1024)) != NULL && mb != max) {
        memset(buffer,0,1024*1024);
        printf("Allocated %d MB\n", ++mb);
    }
    return 0;
}
' > munch.c && gcc -O2 -o munch munch.c 
./munch

它会给出类似这样的输出:

Allocated 1 MB
Allocated 2 MB
Allocated 3 MB
...
Allocated 4367 MB
Allocated 4368 MB
Allocated 4369 MB
Killed

内存使用率最高的程序现在会自动终止,您的系统将始终响应。要查看服务类型的实时日志,journalctl -f -u earlyoom它将显示如下内容:

-- Logs begin at Mon 2014-11-03 10:54:39 WIB. --
Feb 20 13:25:25 s497 earlyoom[20041]: earlyoom v0.3-15-g528196e
Feb 20 13:25:25 s497 earlyoom[20041]: total:  7800 MiB
Feb 20 13:25:25 s497 earlyoom[20041]: min:     780 MiB
Feb 20 13:25:25 s497 earlyoom[20041]: avail:  4963 MiB
Feb 20 13:33:10 s497 earlyoom[20041]: Out of memory! avail: 519 MiB < min: 780 MiB
Feb 20 13:33:10 s497 earlyoom[20041]: Killing process 24984 (munch)

Ctrl+C关闭该命令。

答案2

我在我的几台机器上遇到了同样的问题:就好像 Linux 没有意识到我添加了交换区。

解决方案:将内核从3.x升级到4.x。

相关内容