即使没有配置交换空间,Ubuntu是否仍会进行交换?

在我的/etc/fstab中没有swap分区。
top显示KiB Swap: 0 total, 0 free, 0 used
而swapon什么都没有显示。
所以看起来swap被禁用了。但是当系统的物理内存耗尽时,它开始表现得像在交换:系统几乎无法响应,磁盘访问指示器一直亮着;如果我设法关闭一个占用大量资源的进程(或者它可能被内存不足杀手杀掉),系统就会恢复响应。
在这种情况下,Ubuntu还会进行交换吗?
系统是Ubuntu 16.04。

1swapon显示了什么?没有输出意味着没有配置交换空间。 - PerlDuck
2就像是交换一样:系统变得几乎无法响应。抱歉,这怎么会是“像交换一样”的情况呢?这是因为你的系统运行时没有足够的内存来完成需要进行的操作。而“交换”意味着将内存放入交换空间中,系统认定该内存段长时间未被使用,因此清理出部分内存以供新任务使用,这样更加高效。 - Rinzwind
2+1,系统内存不足。 - mikewhatever
@PerlDuck swapon没有显示任何内容 - Roman Puchkovskiy
@mikewhatever 我可能误解了一些事情。当系统的内存用尽时,不应该导致OOM Killer杀死进程,或者某个进程由于无法成功分配内存而崩溃吗?这两种情况都会带来缓解,但并非每次都会发生。我确实有一些JVM可能会将其所有CPU资源用于垃圾回收,但它不应该导致系统冻结,我想。我可能再次误解了一些事情,请您详细说明一下。 - Roman Puchkovskiy
你的问题是关于交换空间的,并且已经得到了回答。关于内存耗尽的问题不适合在这个问题中讨论。这是一个问答网站,而不是一个对话论坛。 - user535733
1个回答

简短回答:

如果没有交换空间,Ubuntu将不会进行交换。

详细回答:

发生的情况是,Linux内核内存管理器(并非Ubuntu本身)首先会尝试将内存合并成可分配给请求该内存的应用程序的块(您看到的减速),如果无法这样做,则这些应用程序将崩溃,从而释放其内存供表现良好未崩溃的应用程序使用。

内核的OOM Killer ¹仅在无其他方法可行时才会被调用²,并且根据您的高磁盘使用率,您遇到了太小而无法成功分配内存的规则。有关相关部分的说明如下:

换句话说,因为分配过程正在等待其分配调用返回,所以分配过程无法继续进行。该调用无法返回,直到释放内存,从而需要受害进程退出。OOM Killer在选择第二个要杀死的进程之前也会等待受害者退出。

发牢骚:

在我还是个孩子的时候,只要能读懂手册就可以进入IT行业了。那时候32K是标准,64K已经让人惊叹不已。我们过去会检查每一次内存分配,并在应用程序层面上显示“内存不足”,而现在的程序员们却不再这样做了。他们已经被多个显示器、巨大的固态硬盘和比软件运行系统更好的系统宠坏了,所以他们已经不习惯系统出现内存不足的情况了...

;-)


1+1 对于长回答中的细节和发牢骚,我表示赞同 :-) - sudodus
谢谢你提到内存压缩的观点。对于那个一直闪烁的硬盘访问指示灯,我仍然感到困惑,但我想我得再提一个问题来了解它的作用 :) - Roman Puchkovskiy
1为什么你声称OOM Killers不存在?https://en.wikipedia.org/wiki/Out_of_memory / https://unix.stackexchange.com/q/136291/103151 / https://unix.stackexchange.com/q/153585/103151 - Byte Commander
RomanPuchkovskiy 硬盘灯很有可能是OOM killer的调用(它不经常被调用,所以保存在硬盘上)。在阅读@ByteCommander的文档后,谜团解开了! - Fabby
@RomanPuchkovskiy:回答问题的同时,我也学到了一些东西!双赢的局面! - Fabby
我在遇到同样的问题时,偶然看到了这个问题和答案。但我仍然不明白的是,为什么从磁盘读取OOM killer会导致磁盘持续疯狂运转20分钟甚至更长时间。 - Andrew Klaassen