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
よりも常に適切に動作します。)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
と比較すると、必要なスワップ メモリがスワップまたは のと同じである限り、ディスクの読み取りと書き込みの量は 2 つ間で非常に似ているようです。事実に基づく私の個人的な意見では、必要なスワップの量がRAM に実際に保持できるスワップの量よりも少ない限り、 のみを使用するのが最善です。また、メモリに実際に保持できる量よりも多くのスワップが必要になった場合は、ワークロードを変更して回避するか、スワップを無効にして を使用し、をzram が以前にメモリで占めていた量 ( のサイズ * 圧縮率) と同等に設定するのが最善です。ただし、現時点ではこれらの追加テストを適切に記述する時間がありません。zswap
zsmalloc
zram
zswap
max_pool_percent
zram
zram
zram
zram
zswap
zsmalloc
max_pool_percent
zram