Zswap

出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動 検索に移動
zswap
開発元 Seth Jennings ほか
プログラミング言語 C
対応OS Linux
種別 Linux kernel features
ライセンス GNU GPL
公式サイト kernel.org
テンプレートを表示

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

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

内部機構[編集]

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

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

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

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

歴史[編集]

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

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

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

代替[編集]

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

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

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

関連項目[編集]

出典[編集]

  1. ^ Seth Jennings (2 12, 2013). “The zswap compressed swap cache”. LWN.net. 1 22, 2014閲覧。
  2. ^ Jenifer Hopper (12 11, 2012). “New Linux zswap compression functionality”. IBM. 1 31, 2014閲覧。
  3. ^ Michael Larabel (7 11, 2013). “Zswap Merged Into The Linux 3.11 Kernel”. Phoronix. 2 5, 2014閲覧。
  4. ^ Linux kernel documentation: Documentation/vm/zswap.txt”. kernel.org (11 22, 2013). 1 22, 2014閲覧。
  5. ^ Dan Magenheimer (4 22, 2010). “Frontswap [PATCH 0/4] (was Transcendent Memory): Overview”. 12 23, 2014閲覧。
  6. ^ Jonathan Corbet (5 4, 2010). “Cleancache and Frontswap”. LWN.net. 3 26, 2014閲覧。
  7. ^ Linux kernel source tree: kernel/git/torvalds/linux.git: zswap: add to mm/”. kernel.org (7 11, 2013). 2 5, 2014閲覧。
  8. ^ Dan Magenheimer (3 29, 2012). “Zcache and RAMster (oh, and frontswap too): Overview and some benchmarking (PDF)”. p. 12. 8 19, 2015閲覧。
  9. ^ Linux kernel source tree: kernel/git/torvalds/linux.git: zbud: add to mm/”. kernel.org (7 11, 2013). 2 5, 2014閲覧。
  10. ^ [PATCH 0/8] zswap: compressed swap caching” (12 11, 2012). 1 5, 2014閲覧。
  11. ^ [PATCHv10 0/4] zswap: compressed swap caching” (5 8, 2013). 1 5, 2014閲覧。
  12. ^ Linux kernel 3.11, Section 9. Zswap: A compressed swap cache” (9 2, 2013). 1 22, 2014閲覧。
  13. ^ Linux kernel 3.15, Section 4. Memory management” (6 8, 2014). 6 15, 2014閲覧。
  14. ^ Linux kernel source tree: kernel/git/torvalds/linux.git: mm/zswap: support multiple swap devices”. kernel.org (4 7, 2014). 6 15, 2014閲覧。
  15. ^ Dan Magenheimer (4 3, 2013). “In-kernel memory compression”. LWN.net. 3 8, 2014閲覧。

外部リンク[編集]