あなたの質問に答えるために、私はまず一連の実験を行いました。最終的な答えは最後に太字で示されています。

あなたの質問に答えるために、私はまず一連の実験を行いました。最終的な答えは最後に太字で示されています。

zramを使用する主な欠点はLRU反転:

古いページは優先度の高い ZRAM に入り、すぐにいっぱいになりますが、新しいページは低速の [...] swap にスワップインおよびスワップアウトされます。

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は指定されていませんが、Arch Wiki ページそれはそうだと言います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 スピン
  • 512 MB RAM、16 MB ビデオ RAM、2 CPU
  • Linux カーネル 4.13.13-300.fc27.x86_64
  • デフォルトswappiness値 (60)
  • いくつかの実験(を使用)で使用するために、空の512MBのスワップファイル(実験9では300MB)を作成しましたが、まだ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

その後の swapon 操作などにより、実験中にさまざまな設定が行われ、これらの値の約 2% 以内の変動が生じました。

実験操作は次のように構成されています。

  • Firefoxを初めて起動する
  • 約 40 秒待つか、ネットワークとディスクのアクティビティが停止するまで待ちます (どちらか長い方)
  • 実験後の次の状態を記録します(Firefox は実行したままにしておきます。ただし、Firefox がクラッシュした実験 7 と 9 は除きます)

実験後の状態:

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 swap、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 swap、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 MB)、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 swap) は、Firefox がデータを書き込んだ結果、ディスクに約 62,000 セクターが書き込まれたことを示しています。約 1433,000 を超えるセクターは、スワップによって書き込まれたセクターです。次の表を参照してください。
  • 実験の中で最も少ない読み取りセクター数を基準とすると、スワッピングによって発生した余分な読み取りセクターの数に基づいて実験を比較できます。

スワッピングの直接的な結果として書き込まれたセクター数(概算):

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よりも常に適切に動作します。)swappinesszswapzswapmax_pool_percent
  • 値を低くするswappinessと、ページ キャッシュの残量が少なくなりすぎてディスク読み取りが過剰になり、システムが使用できなくなるまでは、システムの動作は改善されるようです。値が高すぎる場合も同様ですmax_pool_percent
  • スワップのみを使用しzramてメモリ内に保持する必要がある匿名ページの量を制限するか、およびzswapのほぼデフォルト値を使用してディスクバックアップスワップを使用します。swappinessmax_pool_percent

編集: ご質問のより詳細な点に答えるための今後の作業としては、特定のユースケースで、 でzsmalloc使用されているアロケータがで使用されているアロケータzramと圧縮の点でどのように比較されるかを調べることが考えられます。ただし、私はそれを行うつもりはなく、ドキュメントやインターネットで検索すべき点を指摘するだけです。zbudzswap

編集 2: echo "zsmalloc" > /sys/module/zswap/parameters/zpoolzswap のアロケータを から に切り替えますzbudzsmalloc上記の実験のテスト フィクスチャを続けて+zramと比較すると、必要なスワップ メモリがスワップまたは のと同じである限り、ディスクの読み取りと書き込みの量は 2 つ間で非常に似ているようです。事実に基づく私の個人的な意見では、必要なスワップの量がRAM に実際に保持できるスワップの量よりも少ない限り、 のみを使用するのが最善です。また、メモリに実際に保持できる量よりも多くのスワップが必要になった場合は、ワークロードを変更して回避するか、スワップを無効にして を使用し、をzram が以前にメモリで占めていた量 ( のサイズ * 圧縮率) と同等に設定するのが最善です。ただし、現時点ではこれらの追加テストを適切に記述する時間がありません。zswapzsmalloczramzswapmax_pool_percentzramzramzramzramzswapzsmallocmax_pool_percentzram

関連情報