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 カーネルの crypto API（英語版） が提供する圧縮モジュールを利用する。このモジュールにより、たとえば圧縮による負荷をメイン CPU ではなく Linux カーネルがサポートするハードウェア圧縮アクセラレータに負担させることができる。望ましい圧縮モジュールの選択は、カーネルブートパラメータ（英語版） zswap.compressor の値を通じて 起動時に動的に行うことができる。指定のない場合、デフォルトで Lempel–Ziv–Oberhumer (LZO) 圧縮アルゴリズムが利用される。Linux カーネルバージョン 3.13 時点で、zswap を利用するには明示的にカーネルブートパラメータ zswap.enabled に 1 を指定する必要がある。 zswap が利用できるメモリプールの最大サイズは sysfs パラメータ max_pool_percent により設定可能である。このパラメータには、総システム RAM の何パーセントをメモリプールが占有できるかを指定する。指定された最大サイズのメモリープールが事前に確保されるわけではなく、必要に応じてサイズは増減する。スワップが実行された結果設定された最大プールサイズに到達した場合、もしくは out-of-memory（英語版） 状態のためプールを拡大することができなかった場合、スワップされたページは Least Recently Used アルゴリズムに基いてメモリプールからスワップデバイスへと退避させられる。このアプローチにより、キャッシュが満杯になった際に最古のキャッシュページがスワップデバイスに退避させられ、新しいスワップページを圧縮してキャッシュするための余地が確保されるという意味で、zswap は真のスワップキャッシュといえる。 zbud は、圧縮されたページの格納用に zswap 内部で利用されている特定用途向けメモリアロケータ（英語版）である。Oracle による、別の仮想メモリ圧縮実装である zcache で利用されている zbud アロケータの書き直しとして実装された。内部的には、zbud は物理メモリページごとに二つまでの圧縮済ページ（"buddies（英語版）" と呼ばれ、これがアロケータ名の由来となっている）を格納できるよう動作するため、開放された領域の結合と再利用が容易である利点を持つ一方で、メモリ利用率が低い（圧縮率が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 を利用するには設計上少くとも一つのスワップデバイスが存在する必要がある。 キャッシュ (コンピュータシステム) ページング方式 ^ Seth Jennings (2月12日2013年). “The zswap compressed swap cache”. LWN.net. 1月22日2014年閲覧。 ^ Jenifer Hopper (12月11日2012年). “New Linux zswap compression functionality”. IBM. 1月31日2014年閲覧。 ^ Michael Larabel (7月11日2013年). “Zswap Merged Into The Linux 3.11 Kernel”. Phoronix. 2月5日2014年閲覧。 ^ “Linux kernel documentation: Documentation/vm/zswap.txt”. kernel.org (11月22日2013年). 1月22日2014年閲覧。 ^ Dan Magenheimer (4月22日2010年). “Frontswap [PATCH 0/4] (was Transcendent Memory): Overview”. 12月23日2014年閲覧。 ^ Jonathan Corbet (5月4日2010年). “Cleancache and Frontswap”. LWN.net. 3月26日2014年閲覧。 ^ “Linux kernel source tree: kernel/git/torvalds/linux.git: zswap: add to mm/”. kernel.org (7月11日2013年). 2月5日2014年閲覧。 ^ Dan Magenheimer (3月29日2012年). “Zcache and RAMster (oh, and frontswap too): Overview and some benchmarking” (PDF). p. 12. 8月19日2015年閲覧。 ^ “Linux kernel source tree: kernel/git/torvalds/linux.git: zbud: add to mm/”. kernel.org (7月11日2013年). 2月5日2014年閲覧。 ^ “[PATCH 0/8] zswap: compressed swap caching” (12月11日2012年). 1月5日2014年閲覧。 ^ “[PATCHv10 0/4] zswap: compressed swap caching” (5月8日2013年). 1月5日2014年閲覧。 ^ “Linux kernel 3.11, Section 9. Zswap: A compressed swap cache” (9月2日2013年). 1月22日2014年閲覧。 ^ “Linux kernel 3.15, Section 4. Memory management” (6月8日2014年). 6月15日2014年閲覧。 ^ “Linux kernel source tree: kernel/git/torvalds/linux.git: mm/zswap: support multiple swap devices”. kernel.org (4月7日2014年). 6月15日2014年閲覧。 ^ Dan Magenheimer (4月3日2013年). “In-kernel memory compression”. LWN.net. 3月8日2014年閲覧。 Linux Transparent Memory Compression - YouTube, September 30, 2013, by Seth Jennings Zswap – a compressed page add-on for the Linux kswapd at the Wayback Machine (archived 2014-02-02), 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