使用 zram 的主要缺点是LRU 反转:
较旧的页面进入优先级较高的 zram 并快速填充它,而较新的页面则被换入和换出较慢的 [...] 交换
zswap 文档说 zswap 不受此影响:
Zswap 通过 Frontswap API 接收用于压缩的页面,并且能够在 LRU 基础上从其自己的压缩池中逐出页面,并在压缩池已满的情况下将它们写回备用交换设备。
我可以通过设置max_pool_percent
来获得 zram 的所有好处和完全压缩的 RAM100
吗?
Zswap seeks to be simple in its policies. Sysfs attributes allow for one user controlled policy: * max_pool_percent - The maximum percentage of memory that the compressed pool can occupy.
这里没有指定默认值max_pool_percent
,但Arch Wiki 页面说它是20
.
除了解压缩的性能影响外,设置max_pool_percent
为是否有任何危险/不利之处100
?
它会像使用改进的交换支持 zram 一样运行吗?
为了回答你的问题,我首先进行了一系列实验。最终答案最后以粗体显示。
进行的实验:
实验前设置:
swappiness
值 (60)dd
),但还swapon
没有watch "killall -9 dnf"
以更确定 dnf 在实验期间不会尝试自动更新或其他东西,并将结果扔得太远实验前状态:
随后的 swapon 操作等导致实验期间的不同设置,导致这些值的差异在大约 2% 以内。
实验操作包括:
实验后状态:
1) 交换文件,zswap 禁用
2) 交换文件,启用 zswap,max_pool_percent = 20
3) 交换文件,启用 zswap,max_pool_percent = 70
4) 交换文件,启用 zswap,max_pool_percent = 100
5) zram 交换,zswap 禁用
6) zram 交换,zswap 启用,max_pool_percent = 20
7) 没有交换
请注意,在记录这些统计信息时,Firefox 并未在此实验中运行。
8) 交换文件,启用 zswap,max_pool_percent = 1
9)交换文件(300 M),zswap启用,max_pool_percent = 100
Firefox 卡住了,系统仍然疯狂地从磁盘读取。由于已写入新的交换文件,因此该实验的基线有所不同:
具体来说,由于此更改,已写入额外的 649384 个扇区。
实验后状态:
从 2022272 中减去额外的 649384 个写入扇区得到 1372888。这小于 1433000(见下文),这可能是因为 Firefox 没有完全加载。
我还用低值
swappiness
(10 和 1)进行了一些实验,它们都因磁盘读取过多而陷入冻结状态,从而阻止我记录最终的内存统计信息。观察:
max_pool_percent
值导致呆滞。max_pool_percent
值会导致最少的写入,而非常低的值会max_pool_percent
导致最多的写入。作为交换的直接结果的书面扇区(大约):
作为交换的直接结果的额外读取扇区(大约):
结果解释:
zswap
但显然不适合此任务。个人观点和轶事:
zswap
默认值为swappiness
and的系统max_pool_percent
总是表现得比任何swappiness
值都好,而没有zswap
或zswap
具有高值的max_pool_percent
.)swappiness
似乎使系统表现更好,直到剩余的页面缓存量太小以至于由于过多的磁盘读取而导致系统无法使用。与太高类似max_pool_percent
。zram
交换并限制您需要在内存中保存的匿名页面的数量,要么使用磁盘支持的交换,其中 和具有zswap
近似默认值。swappiness
max_pool_percent
编辑:未来可能会回答您问题的更详细点的工作是找出您的特定用例中使用的分配器如何
zsmalloc
在zram
压缩方面与中使用的zbud
分配器进行比较zswap
。不过,我不会这样做,只是指出要在文档/互联网上搜索的内容。编辑 2:
echo "zsmalloc" > /sys/module/zswap/parameters/zpool
将 zswap 的分配器从 切换zbud
到zsmalloc
. 继续我的上述实验的测试夹具并zram
与zswap
+进行比较zsmalloc
,似乎只要所需的交换内存与zram
交换或 as相同,两者之间zswap
的max_pool_percent
磁盘读写量非常相似. 我个人基于事实的看法,只要zram
我需要的交换量小于zram
我能承受的实际保存在 RAM 中的交换量,那么最好单独使用zram
;并且一旦我需要的交换量超出内存中的实际容量,最好要么更改我的工作负载以避免它,要么禁用zram
交换并使用zswap
withzsmalloc
和 setmax_pool_percent
相当于 zram 之前在内存中占用的内存(zram
* 压缩比的大小)。不过,我目前没有时间对这些额外的测试进行适当的编写。