我刚刚运行了 4 个内存(和 CPU)密集型任务实例,它几乎耗尽了所有 16 GB 内存,并且还占用了大量交换空间(2GB)。现在程序已完成,我注意到(通过 conky)RAM 被释放,处理器几乎恢复到空闲状态,但交换分区仍然几乎已满。
这让我想到了我的问题,内核什么时候清空交换区?由此推论,我将运行另一批密集型进程,它们也需要获得一些交换空间;交换会被清空不相关的信息,还是会直接崩溃?
答案1
我将在这个答案中使用“快记忆”和“慢记忆”这两个词。它们对实际发生的情况的描述非常糟糕,但我认为这有助于解释正在发生的事情。
您的机器有一个由快速内存和慢速内存组成的“虚拟内存”。您的总内存空间是快内存+慢内存的总和。现在计算机只能直接在快速内存上工作,因此操作系统首先使用它。当快速内存已满时,操作系统会尝试将其部分移动到慢速内存。这可以释放一些快速内存以供使用。现在,如果程序需要使用慢速内存中的某些数据,操作系统会将这段数据从慢速内存移回快速内存(可能需要先将一些数据从快速内存移出到慢速内存以腾出空间)。
这个过程就是“寻呼”,因为系统足够聪明,只需要移动页面内存而不是整个程序。一个程序可以同时存在于快内存和慢内存中。从你的角度来看,唯一的区别是记忆速度慢慢的。
现在,当用完所有快速内存的程序完成时,将有大量空闲的快速内存,而内容仍将位于慢速内存中。但这有问题吗?您拥有相同数量的可用虚拟内存,系统会将这些页面移回到快速内存中如果他们是需要的。如果没有人想要这些页面,那么你不妨将它们留在慢速内存中;它没有害处!
显然,在这个故事中,“快内存”是RAM,“慢内存”是交换区。
好吧,这就是一个“愚蠢”的简单故事。
但这与所发生的情况很接近。
Linux 不交换程序; swap意味着整个程序和数据段都被一次性转移到交换设备上。而是Linux页面;它将内存页发送到交换设备。这意味着程序可能有一些页面位于 RAM 中,一些页面位于交换区中。如果访问交换中的页面,则将按需“调入”; RAM 中的页面将被“换出”以进行交换,以在 RAM 中创建可用空间。
因此,如果您运行的程序使用了 16Gb RAM 和 2Gb 交换空间,然后程序完成,您可能最终会在交换空间中留下页面。但仅有的仍然分配给程序的页面将在那里。如果free
显示 1G 交换空间正在使用中,那么您是仍在某处使用那么多虚拟内存。但是交换中的页面最近没有被访问过,因此可能会留在那里。
现在,根据您的工作负载,将这些页面保留在交换设备上可能会获得更好的性能或者主动将它们带回 RAM 可能会获得更好的性能。但在这两种情况下,您拥有完全相同数量的可用虚拟内存。
(由于 Linux 允许过度使用等,事情变得更加复杂,但这是基本思想)。
围绕虚拟内存管理有很多调整参数(https://www.kernel.org/doc/Documentation/sysctl/vm.txt)但除非您确实需要调整,否则您可能只想保留默认值。 https://en.wikipedia.org/wiki/Swappiness可能是唯一值得一看的。