zswap
関連記事
Zswap は、スワップページに対して圧縮された RAM キャッシュを提供する、カーネルの機能です。ページをディスクにスワップアウトしてしまうのではなく、RAM 内のメモリプールに圧縮して保存します。プールが満タンになったり RAM が枯渇したりすると、最近使用されていない (LRU) ページを解凍して (まるでインターセプトされなかったかのように) ディスクに書き込みます。ページがスワップキャッシュへ解凍された後、プール内の圧縮された方を解放できます。
zram と異なる点は、zram が補助スワップデバイスを必要としない RAM 内のスワップデバイスであるのに対し、zswap はスワップデバイスと組み合わさって動作することです。
目次
zswap を切り替える
安定版の linux 公式カーネルでは、zswap はデフォルトで有効化されています。このことは安定版カーネルの config の CONFIG_ZSWAP_DEFAULT_ON
フラグで確認できます。
zswap を実行時に無効化するには、以下のコマンドを実行してください:
# echo 0 > /sys/module/zswap/parameters/enabled
zswap を永続的に無効化するには、zswap.enabled=0
をカーネルパラメータに追加してください。
zswap のカスタマイズ
現在のパラメータ
Zswap には、カスタマイズ可能なパラメーターがいくつかあります。現在の設定は、次を使用して表示できます:
$ grep -R . /sys/module/zswap/parameters
/sys/module/zswap/parameters/same_filled_pages_enabled:Y /sys/module/zswap/parameters/enabled:Y /sys/module/zswap/parameters/max_pool_percent:20 /sys/module/zswap/parameters/compressor:lz4 /sys/module/zswap/parameters/zpool:z3fold /sys/module/zswap/parameters/accept_threshold_percent:90
様々なパラメーターの説明については、zswap のドキュメントを参照してください。
初期構成を示すブート時ロードメッセージは、次のコマンドで取得できます:
# dmesg | grep zswap:
[ 0.317569] zswap: loaded using pool lz4/z3fold
パラメータの設定
sysfs の使用
各設定は、sysfs インターフェースを介して実行中に変更できます。例えば、compressor
パラメータを変更するには:
# echo lz4 > /sys/module/zswap/parameters/compressor
カーネルブートパラメータの使用
パラメータの変更を永続化するには、対応するオプション (例えば zswap.compressor=lz4
など) をカーネルブートパラメータに追加する必要があります。したがって、上記のすべての設定を永続的に設定するには、次のカーネルパラメータを追加する必要があります:
zswap.enabled=1 zswap.compressor=lz4 zswap.max_pool_percent=20 zswap.zpool=z3fold
ブートパラメータを介して圧縮アルゴリズムを変更する場合、対応する圧縮モジュールがブートの早い段階でロードされていることを確認する必要があります (#圧縮アルゴリズム を参照)。
systemd-swap の使用
systemd-swap は、zram スワップ、スワップファイル、スワップパーティションからハイブリッドスワップ領域を作成するスクリプトです。systemd プロジェクトには参加していません。
systemd-swap パッケージをインストールしてください。/etc/systemd/swap.conf
内の Swap File Chunked セクション内にある swapfc_enabled=1
をアンコメント・設定してください。systemd-swap
サービスを起動/有効化してください。
詳細や推奨される設定に関しては 作者の GitHub ページを見てください。
最大プールサイズ
メモリプールは事前に割り当てられません。使用可能な合計メモリのパーセンテージによる特定の制限まで (デフォルトでは合計 RAM の最大20%まで) 拡張できます。このしきい値に達すると、ページはプールからスワップデバイスに追い出されます。圧縮されたプールの最大サイズは、パラメーター max_pool_percent
で制御されます。
圧縮メモリプールアロケータ
zpool パラメータは、圧縮メモリプールの管理を制御します。
zbud データアロケーターを使用すると、2つの圧縮オブジェクトが1ページに格納され、圧縮率が2以下に制限されます。
優れた z3fold アロケーターでは、ページごとに最大3つの圧縮オブジェクトを使用できます。z3fold の圧縮率は通常平均2.7ですが、zbud の圧縮率は1.7です。
タイプ z3fold の zpool がデフォルトで作成されます。カーネルパラメータ zswap.zpool
を使用して、起動時に別のメソッドを選択してください。データアロケータは、sysfs インターフェースを介して後の段階で変更することもできます。
圧縮アルゴリズム
ページ圧縮の場合、zswap はカーネルの暗号化 API によって提供されるコンプレッサーモジュールを使用します。デフォルトでは lz4 圧縮アルゴリズムを使用しますが、これは起動時に zswap.compressor
で変更できます。その他のオプションには、deflate、lz4hc、lzo、lzo-rle、842、zstd があります。
実行中に sysfs または systemd-swap を使用して圧縮を変更することに問題はありませんが、この場合、 zswap は lz4 で開始し、後の段階で定義されたアルゴリズムに切り替わります。別のアルゴリズムで zswap をすぐに開始するには、これをカーネルのブートパラメータを介して設定し、対応するモジュールをカーネルによって早期にロードする必要があります。これは、次の手順に従って実行できます:
- 選んだコンプレッサーに関連するモジュールを mkinitcpio#MODULES 配列に追加する。
- mkinitcpio の設定を変更した後、RAM ディスク環境を再生成する。mkinitcpio#イメージ作成とアクティベーション を参照してください。
- カーネルパラメータ で
zswap.compressor
をあなたの選んだアルゴリズムに設定します。
次回の起動時に、#現在のパラメータ を参照して、zswap が要求されたコンプレッサーを使用するかどうかを確認してください。