Zswap

zswap とは、を実現する Linux カーネルの機能で、スワップされたページを圧縮されたライトバックキャッシュ上に保持する。がスワップアウトされる際にスワップデバイス上に移動させるのではなく、システム RAM 上に動的に確保されるメモリプール内に圧縮して保存する。実スワップデバイスへのライトバックは延期されるか完全に回避されるので、スワップが必要とされる Linux システム上の I/O を大きく低減させることができる。トレードオフとして、圧縮を実行するために CPU サイクルの消費は増加する。

組み込みデバイスやネットブックその他のローエンドハードウェアデバイスなどに加え、SSD をストレージに利用するデバイスなど、様々なを用いるデバイスにおいて、zswap の I/O が低減される利点を活かすことができる。なぜなら、フラッシュメモリは原理上書き込み回数が限られておりスワップ領域として利用されると急速に消耗してしまうためである。

内部機構 
zswap は、Linux カーネルの仮想メモリサブシステムに、frontswap が提供する API を利用して組込まれている。frontswap とは、Linux カーネル内で様々な種類のストレージを抽象化してスワップ領域として利用するための機構である。結果として、zswap は 内部的には疑似 RAM デバイスを提供する frontswap のバックエンドドライバーとして動作する。言い換えると、 zswap は frontswap API により、スワップアウトされるメモリページをインターセプトすることで、ページフォールトの際にスワップ済のページをインターセプトすることが可能となる。 これら二つのパスにアクセスできることにより、 zswap はスワップされたページの圧縮されたライトバックキャッシュとして振る舞うことができる。

内部的には、zswap は Linux カーネルの  が提供する圧縮モジュールを利用する。このモジュールにより、たとえば圧縮による負荷をメイン CPU ではなく Linux カーネルがサポートするハードウェア圧縮アクセラレータに負担させることができる。望ましい圧縮モジュールの選択は、 zswap.compressor の値を通じて
起動時に動的に行うことができる。指定のない場合、デフォルトで Lempel–Ziv–Oberhumer (LZO) 圧縮アルゴリズムが利用される。Linux カーネルバージョン 3.13 時点で、zswap を利用するには明示的にカーネルブートパラメータ zswap.enabled に 1 を指定する必要がある。

zswap が利用できるメモリプールの最大サイズは sysfs パラメータ max_pool_percent により設定可能である。このパラメータには、総システム RAM の何パーセントをメモリプールが占有できるかを指定する。指定された最大サイズのメモリープールが事前に確保されるわけではなく、必要に応じてサイズは増減する。スワップが実行された結果設定された最大プールサイズに到達した場合、もしくは  状態のためプールを拡大することができなかった場合、スワップされたページは
Least Recently Used アルゴリズムに基いてメモリプールからスワップデバイスへと退避させられる。このアプローチにより、キャッシュが満杯になった際に最古のキャッシュページがスワップデバイスに退避させられ、新しいスワップページを圧縮してキャッシュするための余地が確保されるという意味で、zswap は真のスワップキャッシュといえる。

zbud は、圧縮されたページの格納用に zswap 内部で利用されている特定用途向けである。Oracle による、別の仮想メモリ圧縮実装である zcache で利用されている zbud アロケータの書き直しとして実装された。内部的には、zbud は物理メモリページごとに二つまでの圧縮済ページ（"" と呼ばれ、これがアロケータ名の由来となっている）を格納できるよう動作するため、開放された領域の結合と再利用が容易である利点を持つ一方で、メモリ利用率が低い（圧縮率が2を超えない）という欠点もある。zbud のもう一つの設計上のメリットとして、zbud は非圧縮時のページが元々占有していた領域よりも大きなメモリ領域をアロケートすることはない、すなわち本来使用するはずだったメモリ領域以上の領域を使用することが無い。

歴史 
zswap と zbud は、どちらも Seth Jennings により作成された。最初のアナウンスは2012年になされ、2013年5月までの開発の結果コードベースは成熟段階に達しているが、未だに実験的カーネル機能の状態である。

zswap は（zbud と共に） Linux カーネルのメインラインに2013年9月2日にリリースされたバージョン 3.11 においてマージされた。

2014年6月8日リリースのバージョン 3.15 からは、複数のスワップデバイスを適切にサポートするようになった。

代替 
zswap の代替となりうるものの一つに zram が挙げられる。この手法は似ているもののまた別の「RAM 上に圧縮されたスワップページを置く」機構を Linux カーネルに提供する。

主な違いは、zram はデータの格納用に RAM を利用した圧縮ブロックデバイスを提供し、これを通常のスワップデバイスとして追加で利用するという点である。zram を利用するには、mkswap  コマンドラインユーティリティによる初期化と swapon による利用設定を側から行う必要がある。その設計上、zram はスワップが他に存在しない場合にもスワップ領域を提供することができるため、組み込みシステムなどスワップ領域がもともと存在しないシステムにより適している。

比較すると、zswap は透過的に動作しユーザースペースでの設定が必要なく、通常のスワップデバイスの RAM ベース圧縮キャッシュとして動作する。これにより zswap は zram にはない、より使われていないスワップページを退避させる機構を持っている。しかし、zswap を利用するには設計上少くとも一つのスワップデバイスが存在する必要がある。

関連項目 
 キャッシュ (コンピュータシステム)
 ページング方式

出典

外部リンク 
 , September 30, 2013, by Seth Jennings
 Zswap a compressed page add-on for the Linux kswapd, University of Liege, March 15, 2013, by Sylvain Martin
 The Compression Cache: Virtual Memory Compression for Handheld Computers, March 16, 2000, by Michael J. Freedman

メモリ管理