使用 zram 的主要缺点是LRU反转:
较旧的页面进入优先级较高的 zram 并快速填充它,而较新的页面则从较慢的交换区换入和换出 [...]
这zswap 文档说 zswap 不会受到这个问题的影响:
Zswap 通过 Frontswap API 接收页面进行压缩,并且能够以 LRU 为基础从自己的压缩池中逐出页面,并在压缩池已满的情况下将它们写回后备交换设备。
max_pool_percent
通过设置为 ,我可以享受 zram 和完全压缩 RAM 的所有好处吗100
?
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
指定默认值,但是拱门维基页面说是的20
。
除了解压缩的性能影响之外,设置max_pool_percent
为是否有任何危险/缺点100
?
它会像使用改进的交换支持的 zram 一样运行吗?
答案1
为了回答你的问题,我首先进行了一系列实验。最终答案以粗体显示在最后。
进行的实验:
1) swap file, zswap disabled
2) swap file, zswap enabled, max_pool_percent = 20
3) swap file, zswap enabled, max_pool_percent = 70
4) swap file, zswap enabled, max_pool_percent = 100
5) zram swap, zswap disabled
6) zram swap, zswap enabled, max_pool_percent = 20
7) no swap
8) swap file, zswap enabled, max_pool_percent = 1
9) swap file (300 M), zswap enabled, max_pool_percent = 100
实验前设置:
- 虚拟盒 5.1.30
- Fedora 27,xfce spin
- 512 MB RAM、16 MB 视频 RAM、2 个 CPU
- Linux内核4.13.13-300.fc27.x86_64
- 默认
swappiness
值 (60) - 创建了一个空的 512 MB 交换文件(实验 9 中为 300 MB),以便在某些实验期间可能使用(使用) ,
dd
但尚未swapon
- 禁用所有 dnf* systemd 服务,运行
watch "killall -9 dnf"
以确保 dnf 不会在实验期间尝试自动更新或其他操作,从而使结果偏离太多
实验前说明:
[root@user-vm user]# free -m ; vmstat ; vmstat -d
total used free shared buff/cache available
Mem: 485 280 72 8 132 153
Swap: 511 0 511
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 74624 8648 127180 0 0 1377 526 275 428 3 2 94 1 0
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 102430 688 3593850 67603 3351 8000 1373336 17275 0 26
sr0 0 0 0 0 0 0 0 0 0 0
随后的交换操作等导致实验期间的不同设置,导致这些值的差异在大约 2% 以内。
实验操作包括:
- 首次运行 Firefox
- 等待大约 40 秒或直到网络和磁盘活动停止(以较长者为准)
- 记录实验后的以下状态(firefox保持运行,除了实验7和实验9,firefox崩溃了)
实验后状态:
1) 交换文件,zswap 禁用
[root@user-vm user]# free -m ; vmstat ; vmstat -d
total used free shared buff/cache available
Mem: 485 287 5 63 192 97
Swap: 511 249 262
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 255488 5904 1892 195428 63 237 1729 743 335 492 3 2 93 2 0
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 134680 10706 4848594 95687 5127 91447 2084176 26205 0 38
sr0 0 0 0 0 0 0 0 0 0 0
2) 交换文件,启用 zswap,max_pool_percent = 20
[root@user-vm user]# free -m ; vmstat ; vmstat -d
total used free shared buff/cache available
Mem: 485 330 6 33 148 73
Swap: 511 317 194
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 325376 7436 756 151144 3 110 1793 609 344 477 3 2 93 2 0
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 136046 1320 5150874 117469 10024 41988 1749440 53395 0 40
sr0 0 0 0 0 0 0 0 0 0 0
3) 交换文件,启用 zswap,max_pool_percent = 70
[root@user-vm user]# free -m ; vmstat ; vmstat -d
total used free shared buff/cache available
Mem: 485 342 8 32 134 58
Swap: 511 393 118
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 403208 8116 1088 137180 4 8 3538 474 467 538 3 3 91 3 0
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 224321 1414 10910442 220138 7535 9571 1461088 42931 0 60
sr0 0 0 0 0 0 0 0 0 0 0
4) 交换文件,启用 zswap,max_pool_percent = 100
[root@user-vm user]# free -m ; vmstat ; vmstat -d
total used free shared buff/cache available
Mem: 485 345 10 32 129 56
Swap: 511 410 101
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 420712 10916 2316 130520 1 11 3660 492 478 549 3 4 91 2 0
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 221920 1214 10922082 169369 8445 9570 1468552 28488 0 56
sr0 0 0 0 0 0 0 0 0 0 0
5)zram交换,zswap禁用
[root@user-vm user]# free -m ; vmstat ; vmstat -d
total used free shared buff/cache available
Mem: 485 333 4 34 147 72
Swap: 499 314 185
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
5 0 324128 7256 1192 149444 153 365 1658 471 326 457 3 2 93 2 0
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 130703 884 5047298 112889 4197 9517 1433832 21037 0 37
sr0 0 0 0 0 0 0 0 0 0 0
zram0 58673 0 469384 271 138745 0 1109960 927 0 1
6) zram 交换,启用 zswap,max_pool_percent = 20
[root@user-vm user]# free -m ; vmstat ; vmstat -d
total used free shared buff/cache available
Mem: 485 338 5 32 141 65
Swap: 499 355 144
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 364984 7584 904 143572 33 166 2052 437 354 457 3 3 93 2 0
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 166168 998 6751610 120911 4383 9543 1436080 18916 0 42
sr0 0 0 0 0 0 0 0 0 0 0
zram0 13819 0 110552 78 68164 0 545312 398 0 0
7)无交换
请注意,在记录这些统计数据时,本实验中 Firefox 并未运行。
[root@user-vm user]# free -m ; vmstat ; vmstat -d
total used free shared buff/cache available
Mem: 485 289 68 8 127 143
Swap: 0 0 0
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 70108 10660 119976 0 0 13503 286 607 618 2 5 88 5 0
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 748978 3511 66775042 595064 4263 9334 1413728 23421 0 164
sr0 0 0 0 0 0 0 0 0 0 0
8) 交换文件,启用 zswap,max_pool_percent = 1
[root@user-vm user]# free -m ; vmstat ; vmstat -d
total used free shared buff/cache available
Mem: 485 292 7 63 186 90
Swap: 511 249 262
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 255488 7088 2156 188688 43 182 1417 606 298 432 3 2 94 2 0
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 132222 9573 4796802 114450 10171 77607 2050032 137961 0 41
sr0 0 0 0 0 0 0 0 0 0 0
9) 交换文件 (300 M),启用 zswap,max_pool_percent = 100
Firefox 被卡住了,系统仍然疯狂地从磁盘读取数据。由于写入了新的交换文件,因此该实验的基线有所不同:
total used free shared buff/cache available
Mem: 485 280 8 8 196 153
Swap: 299 0 299
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 8948 3400 198064 0 0 1186 653 249 388 2 2 95 1 0
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 103099 688 3610794 68253 3837 8084 1988936 20306 0 27
sr0 0 0 0 0 0 0 0 0 0 0
具体来说,由于此更改,额外写入了 649384 个扇区。
实验后状态:
[root@user-vm user]# free -m ; vmstat ; vmstat -d
total used free shared buff/cache available
Mem: 485 335 32 47 118 53
Swap: 299 277 22
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
7 1 283540 22912 2712 129132 0 0 83166 414 2387 1951 2 23 62 13 0
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 3416602 26605 406297938 4710584 4670 9025 2022272 33805 0 521
sr0 0 0 0 0 0 0 0 0 0 0
从 2022272 中减去额外的 649384 个写入扇区,结果为 1372888。这小于 1433000(见下文),这可能是因为 Firefox 未完全加载。
我还用低值(10 和 1)进行了一些实验swappiness
,它们都因过多的磁盘读取而陷入冻结状态,导致我无法记录最终的内存统计数据。
观察结果:
- 主观上,高
max_pool_percent
价值导致迟缓。 - 主观上,实验 9 中的系统速度太慢,以至于无法使用。
- 高
max_pool_percent
值会导致最少的写入量,而非常低的值max_pool_percent
会导致最多的写入量。 - 实验 5 和 6(zram 交换)表明 Firefox 写入的数据导致大约 62000 个扇区写入磁盘。任何高于 1433000 的扇区都是由于交换而写入的。参见下表。
- 如果我们假设实验中读取扇区的最低数量作为基线,我们可以根据交换造成的额外读取扇区数量来比较实验。
交换直接导致的书面扇区(大约):
650000 1) swap file, zswap disabled
320000 2) swap file, zswap enabled, max_pool_percent = 20
30000 3) swap file, zswap enabled, max_pool_percent = 70
40000 4) swap file, zswap enabled, max_pool_percent = 100
0 5) zram swap, zswap disabled
0 6) zram swap, zswap enabled, max_pool_percent = 20
-20000 7) no swap (firefox crashed)
620000 8) swap file, zswap enabled, max_pool_percent = 1
-60000 9) swap file (300 M), zswap enabled, max_pool_percent = 100 (firefox crashed)
交换直接导致的额外读取扇区(大约):
51792 1) swap file, zswap disabled
354072 2) swap file, zswap enabled, max_pool_percent = 20
6113640 3) swap file, zswap enabled, max_pool_percent = 70
6125280 4) swap file, zswap enabled, max_pool_percent = 100
250496 5) zram swap, zswap disabled
1954808 6) zram swap, zswap enabled, max_pool_percent = 20
61978240 7) no swap
0 (baseline) 8) swap file, zswap enabled, max_pool_percent = 1
401501136 9) swap file (300 M), zswap enabled, max_pool_percent = 100
结果解读:
- 这是主观的,并且特定于当前的用例;在其他用例中行为会有所不同。
- Zswap 的页面池占用了 RAM 中原本可以由系统页面缓存(用于文件支持的页面)使用的空间,这意味着系统会重复丢弃文件支持的页面并在需要时再次读取它们,从而导致过多的读取。
- 实验 7 中的大量读取是由同样的问题引起的 - 系统的匿名页面占用了大部分 RAM,并且必须从磁盘重复读取文件支持的页面。
- 在某些情况下,可以将写入交换磁盘的数据量最小化到接近于零,
zswap
但它显然不适合此任务。 - 不可能有“完全压缩的RAM“因为系统需要一定数量的非交换页驻留在 RAM 中进行操作。
个人观点和轶事:
- zswap 在磁盘写入方面的主要改进不是它压缩页面,而是它有自己的缓冲和缓存系统,可以减少页面缓存并有效地将更多匿名页面(以压缩形式)保留在 RAM 中。 (但是,根据我日常使用 Linux 时的主观经验,具有 swap 且
zswap
默认值为swappiness
和的系统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
swap 或 aszswap
相同max_pool_percent
,两者之间的磁盘读写量就非常相似。 。基于事实,我个人认为,只要我需要的swap数量zram
小于我实际可以保留在RAM中的swap数量zram
,那么最好单独使用zram
;一旦我需要的交换量超过了内存中实际保留的量,最好改变我的工作负载以避免它,或者禁用zram
交换并使用zswap
withzsmalloc
并将其设置为与 zram 之前在内存中占用的值相同的值( *压缩比max_pool_percent
的大小) zram
)。不过,我目前没有时间对这些额外的测试进行适当的编写。