Linux 服务器在内存完全填满之前进行交换

Linux 服务器在内存完全填满之前进行交换

我预计在进行交换之前会使用所有 RAM,但我遇到了这个奇怪的结果htop

服务器上运行的 htop 的屏幕截图。

这意味着在我的服务器上有 24GB 的 RAM,我的软件将 1GB 的内存交换到磁盘,而它们总共只使用了 23GB 的内存。

当使用的内存少于硬件可用内存时,我没想到会发生交换……服务器为什么这样做?

答案1

此行为通过内核设置控制,称为vm.swappiness,可设置为 0 到 100 之间的一个值。默认值为 60,这将导致系统在物理内存完全填满之前进行一定程度的交换,这有助于在内存压力下保持性能,但又不会因为过度交换而降低性能。鞭笞

可以通过将 swappiness 设置为 0 来禁用此功能,在这种情况下,除非绝对必要,否则系统不会进行交换。如果您通常有大量可用 RAM,这可能是有意义的。但是,一旦系统的物理内存完全填满,性能就会急剧下降,因为系统会在应用程序需要内存时突然被迫进行交换,而不是提前进行交换,并且在您的服务器运行接近满负荷的情况下不建议这样做。

最好将 swappiness 设置为较低(但非零)的值,例如 10,这将减少不必要的交换,同时不必等到最后一刻才在程序需要时释放 RAM。最佳设置取决于您的环境,因此请尝试不同的设置,直到获得最佳效果。

要更改 swappiness 设置,请以 root 身份将所需值写入/proc/sys/vm/swappinessecho要进行永久更改,请添加一行vm.swappiness/etc/sysctl.conf根据需要将 10 替换为所需值):

vm.swappiness = 10

答案2

出于性能原因,操作系统不会等到最后一秒才交换内存。具体实现取决于您使用的操作系统,但大多数现代操作系统会在物理内存已满之前进行交换。交换通常发生在系统未满负荷时,因此当有更多工作时,系统有足够的 RAM 并准备好处理工作。

对于桌面系统,有些操作系统(例如:Windows)甚至会将你经常使用的软件预加载到内存中,将当前不使用的数据放在硬盘上。这在系统刚安装时效果不佳,但随着你使用它,它会变得越来越好。

相关内容