![为什么 vm.swappiness 不起作用?](https://linux22.com/image/929642/%E4%B8%BA%E4%BB%80%E4%B9%88%20vm.swappiness%20%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%EF%BC%9F.png)
~ 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