掉期-会发生什么?


8

在我的具有512 MB RAM和348 MB交换空间的Debian VM机器上,如果在编辑器中打开1 GB的文件而内存不足,会发生什么情况?

它会使系统崩溃吗?否则,Linux将如何处理?

安装Swapspace是否明智,因此如果需要,可以自动动态创建足够的交换空间?

sudo apt-get install swapspace

您为什么不给它更多的掉期?
guntbert 2014年

HDD空间在我的VM上很昂贵
rubo77

1
请注意,有些编辑器仅对文件进行内存映射,而不是预先加载所有文件,这完全解决了此问题,因为他们将源文件本身用作“交换”。

Answers:


17

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

如果禁用了内存过量使用,则编辑器(可能同时尝试其他程序)尝试分配内存将失败。他们将从系统调用中获得失败结果。尽管不幸的是,普遍的结果是程序崩溃,但它取决于每个程序来处理。例如,编辑器也可能只是拒绝打开文件。

如果启用了内存过量使用,那么请求内存的系统调用很可能会成功。在这种情况下,当实际访问内存时,内核将注意到内存不足,并终止进程以回收内存。该过程可能是编辑器,也可能不是。该选择取决于系统上每个进程的(oom_score几种内核试探法的结果)和oom_score_adj(配置的)。这些也在proc(5)联机帮助页中。


5

在这种情况下,如果遇到内存不足的情况,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文件”或“并行运行太多图形文件大小调整”之类的错误操作结论:是否需要交换?


1
+1表示建议您自己进行测试的简单方法
rubo77 2014年

1
它回答了第二个问题“使用动态交换分配是否是个好主意”。
gena2x 2014年

@ gena2x是的,这是一个非常好的主意,因为它使您的系统在过载的情况下具有更高的响应能力,而不是一个接一个地杀死您的任务。-1。尽管最好的方法是拥有一个较大的固定交换分区,但这是另一个原因(减少了交换碎片)。
彼得-恢复莫妮卡2014年

如果您有较大的固定交换空间,则系统将变得无响应,因为它将尝试将活动任务交换出到磁盘,并且它们将永远交换回去。
gena2x
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.