在具有 512 MB RAM 和 348 MB 交换空间的 Debian VM 机器上,如果我在编辑器中打开 1 GB 文件并内存不足,会发生什么情况?
会导致系统崩溃吗?或者如果不是,Linux 将如何处理这个问题?
安装不是明智之举交换空间那么如果需要的话,会自动动态地创建足够的交换空间吗?
sudo apt-get install swapspace
答案1
这取决于您运行时的设置,特别是内存过量使用(/proc/sys/vm/overcommit_memory
;请参阅man 5 proc
了解详细信息)。
如果禁用内存过量使用,编辑器(以及可能同时尝试的其他程序)分配内存的尝试将失败。他们将从系统调用中得到失败结果。由每个程序来处理这个问题,但不幸的是,常见的结果是程序崩溃。例如,编辑器也可能只是拒绝打开文件。
如果启用了内存过量使用,那么请求内存的系统调用很可能会成功。在这种情况下,当内存被实际访问时,内核会注意到内存不足,并杀死一个进程来回收内存。该进程可能是也可能不是编辑器。该选择取决于系统上每个进程的oom_score
(几个内核启发式的结果)和(配置)。oom_score_adj
这些也在 proc(5) 联机帮助页中。
答案2
在这种情况下,Linux 中存在一个巨大的问题,如果您接近内存不足的情况 - 您会注意到整个系统变得完全没有响应,因为它开始大量交换。甚至您的鼠标光标也可能变得如此“慢”,以至于您无法启动终端并手动终止有问题的内存吞噬进程。这是因为大量的磁盘操作。
为了避免这种情况,我个人通常会完全禁用交换,因此 Linux 内核始终能够做出响应,并且在最坏的情况下,内存不足 (OOM) 杀手会杀死某些进程。 OOM 杀死哪个进程的逻辑取决于内核版本。
所以答案是否定的 - 不要启用动态交换分配。你将面临机器挂起。
使用只需在循环中不断分配一些内存的程序来尝试它很容易。将此程序保存到文本文件中memeater.c
:
#include <stdlib.h>
int main() {
for (;;) {char* mem=malloc(4096); mem[0]=1;};
}
然后编译它:
$ gcc memeater.c -o memeater
并运行:
$ ./memeater
尝试使用交换、不使用交换以及使用动态交换分配。
另外,请记住,在大多数情况下,发生这种 OOM 情况的原因是软件中的错误(内存泄漏)或您执行了错误操作,例如“在编辑器中加载此 10 GB 文件”或“并行运行太多图形文件调整大小”并执行以下操作结论:是否需要交换?