为什么 vm.swappiness 不起作用?

为什么 vm.swappiness 不起作用?
 ~ uname -a
Linux user 5.4.0-48-generic #52-Ubuntu SMP Thu Sep 10 10:58:49 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

 ~ cat /proc/sys/vm/swappiness
 5

 ~ free -h
              total        used        free      shared  buff/cache   available
Mem:          7.7Gi       6.0Gi       123Mi       1.1Gi       1.5Gi       278Mi
Swap:         3.8Gi       2.0Gi       1.8Gi

Ubuntu 18.04 上也出现了同样的行为,我以为在 Ubuntu 20.04 上这个问题会得到解决,但我遇到了同样的问题。

无论我使用交换文件还是 zram,设置 vm.swappiness 都不起作用。

按照要求:

top - 21:46:46 up 13 min,  2 users,  load average: 3.86, 3.82, 2.20
Tasks: 268 total,   3 running, 265 sleeping,   0 stopped,   0 zombie
%Cpu(s): 39.0 us, 14.0 sy,  0.1 ni, 46.8 id,  0.1 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   7858.1 total,    146.8 free,   5743.9 used,   1967.3 buff/cache
MiB Swap:   4096.0 total,   3960.5 free,    135.5 used.    971.5 avail Mem

 ~ grep -i swap /etc/fstab
/swapfile                                 none            swap    sw              0       0

答案1

相反,5.4 内核在 VM 系统中出现了一些问题。

在 5.4 内核系列中,我可以在自己家里的 16GB 系统上运行 4GB 左右的应用程序,执行涉及 5-10GB 以上磁盘 I/O 的操作,最终我有 2GB 以上的空间被交换出去……如果我下拉菜单或进行其他操作,就会出现一个很长的 swapin 暂停。设置 vm.swappiness=1 与 vm.swapiness=100 相比,与默认值相比,对 5.4.x 内核的影响似乎很小甚至没有影响。

在 Ubuntu 18.04 中运行的 5.4 之前的内核以及我在 Ubuntu 18.04 中运行的 5.7.x 内核(Ubuntu 主线内核安装程序),如果设置 vm.swappiness=100,其交换仍然不如 5.4 那么积极。我并不建议将值设置为 vm.swappiness=1,但在 5.4.x 系列中,它似乎仍然交换得相当频繁,在 5.4 之前和 5.4 之后的内核中,如果我运行足够多的应用程序,它会让应用程序在交换之前几乎填满 RAM,这会导致相当糟糕的性能,因为留给磁盘缓存的 RAM 量非常少;它确实显示交换使用率接近于零,直到 RAM 非常满。

答案2

解决办法是增加vm.watermark_scale_factor(大文章关于这个话题)

sudo sysctl -w vm.watermark_scale_factor=1000应该具有您想要的效果:

当可用内存低于 10%(其中10 := watermark_scale_factor / 100)时,内核将唤醒卡斯帕德因此会将内存页面换出到交换区(或丢弃缓存页面,实际上取决于vm.swappiness)直到可用内存达到 20%

有用的参考:https://www.kernel.org/doc/Documentation/sysctl/vm.txt

相关内容