如何让我的系统仅在 RAM 完全满时使用交换区?

如何让我的系统仅在 RAM 完全满时使用交换区?

过去,设置vm.swappiness0意味着系统仅在 RAM 完全满时才会进行交换。

$ cat /etc/sysctl.d/99-sysctl.conf
kernel.sysrq = 1
vm.swappiness=0
$ sysctl vm.swappiness
vm.swappiness = 0

然而,最近这个设置仍然允许交换,甚至在清除交换后几秒钟sudo swapoff -a; sudo swapon -a。例如,几个小时后,

$ free -m
        total   used   free   shared  buff/cache  available
Mem:    32047   7914    325     1509       23807      22177
Swap:    1974   1974      0

因此,我有 22177 MiB available。从man free

可用的

估计有多少内存可用于启动新应用程序(无需交换)。

然而,我的系统仍然进行大量交换,使用了 1974 MiB 的交换空间并减慢了速度。

我也尝试过设置vm.swappiness1,结果类似。我还尝试了不同的内核,包括最近的 LTS 4.19.17-1、4.19.16-1-lts、4.19.15-1-lts 和许多其他 LTS 版本,以及主线 4.18.16.arch1- 1.如何防止不必要的系统交换?

显然在较新版本的内核上进行设置vm.swappiness = 0意味着它将“在空闲页面和文件支持页面的数量小于区域中的高水位线之前不会启动交换”。我不确定这个“高水位线”是什么,但我有很多可用内存!其他建议OOM 杀手当发生这种情况时将被调用(而不是交换本身)。是否可以在没有 RAM 的情况下阻止交换,并防止发生 OOM 杀死(除非 RAM 和交换都已满)?

相关内容