为了回答你的问题,我首先进行了一系列实验。最终答案以粗体显示在最后。

为了回答你的问题,我首先进行了一系列实验。最终答案以粗体显示在最后。

使用 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值、没有zswapzswap具有较高值的​​系统表现得更好max_pool_percent。)
  • 较低的swappiness值似乎会使系统表现得更好,直到剩余的页面缓存量非常小,导致系统由于过多的磁盘读取而无法使用。与太高类似max_pool_percent
  • 要么仅使用zram交换并限制需要在内存中保存的匿名页面的数量,要么使用磁盘支持的交换,并且和 的zswap值大约为默认值。swappinessmax_pool_percent

编辑:未来回答您问题的细节的可能工作是找出您的特定用例zsmalloc中使用的分配器如何在zram压缩方面与zbud中使用的分配器进行比较zswap。不过,我不会这样做,只是指出要在文档/互联网上搜索的内容。

编辑2: echo "zsmalloc" > /sys/module/zswap/parameters/zpool将 zswap 的分配器从 切换zbudzsmalloc.继续我的上述实验的测试装置并zramzswap+进行比较zsmalloc,似乎只要所需的交换内存与zramswap 或 aszswap相同max_pool_percent,两者之间的磁盘读写量就非常相似。 。基于事实,我个人认为,只要我需要的swap数量zram小于我实际可以保留在RAM中的swap数量zram,那么最好单独使用zram;一旦我需要的交换量超过了内存中实际保留的量,最好改变我的工作负载以避免它,或者禁用zram交换并使用zswapwithzsmalloc并将其设置为与 zram 之前在内存中占用的值相同的值( *压缩比max_pool_percent的大小) zram)。不过,我目前没有时间对这些额外的测试进行适当的编写。

相关内容