掉期 - 会发生什么?

rub*_*o77 8 memory swap out-of-memory

在我有 512 MB RAM 和 348 MB 交换的 Debian VM 机器上,如果我在编辑器中打开一个 1 GB 的文件并且内存不足会发生什么?

会不会导致系统崩溃?或者如果没有,Linux 将如何处理?

安装Swapspace是否明智,以便在需要时自动和动态地创建足够的交换?

sudo apt-get install swapspace
Run Code Online (Sandbox Code Playgroud)

der*_*ert 17

这取决于您正在运行的设置,特别是内存过量使用(/proc/sys/vm/overcommit_memory;man 5 proc有关详细信息,请参阅)。

如果禁用内存过量使用,编辑器(以及可能同时尝试的其他程序)分配内存的尝试将失败。他们会从系统调用中得到一个失败的结果。由每个程序来处理这个问题,但不幸的是,常见的结果是程序崩溃。例如,编辑器也可能只是拒绝打开文件。

如果启用内存过量使用,那么请求内存的系统调用很可能会成功。在这种情况下,当实际访问内存时,内核会注意到它的内存不足,并杀死一个进程来回收内存。该过程可能是也可能不是编辑器。选择由系统上每个进程的(oom_score几个内核启发式的结果)和oom_score_adj(配置的)控制。这些也在那个 proc(5) 联机帮助页中。


gen*_*a2x 5

在这种情况下,如果您接近内存不足的情况,Linux 中有一个巨大的问题 - 您会注意到整个系统变得完全没有响应,因为它开始了大量交换。甚至您的鼠标光标也可能变得如此“缓慢”,以至于您无法启动终端并手动终止有问题的内存吞噬进程。这是因为大量的磁盘操作。

为了避免这种情况,我个人通常完全禁用交换,因此 Linux 内核始终响应,在最坏的情况下,内存不足 (OOM) 杀手会杀死某些进程。OOM杀死哪个进程的逻辑取决于内核版本。

所以答案是否定的 - 不要启用动态交换分配。您将面临机器挂起。

用一个不断在循环中分配一些内存的程序来尝试它很容易。将此程序保存到文本文件中memeater.c

#include <stdlib.h>

int main() {
    for (;;) {char* mem=malloc(4096); mem[0]=1;};
}
Run Code Online (Sandbox Code Playgroud)

然后编译它:

$ gcc memeater.c -o memeater
Run Code Online (Sandbox Code Playgroud)

并运行:

$ ./memeater
Run Code Online (Sandbox Code Playgroud)

尝试使用交换、不使用交换和动态交换分配。

另外,请记住,在大多数情况下,这种 OOM 情况的发生是因为软件中的错误(内存泄漏)或者您做错了什么,例如“在编辑器中加载这个 10 GB 文件”或“并行运行过多的图形文件调整大小”并执行结论:您是否需要交换?

  • +1建议自己测试的简单方法 (2认同)