zswapとは
zswapは、
Linuxカーネルが提供する仮想メモリの圧縮機能であり、スワップされたページを圧縮してライトバックキャッシュに保持します。この機能により、メモリページがスワップアウトされる際に、通常のスワップデバイスに移動させる代わりに、システムのRAM内で動的に確保された
メモリプールに圧縮形式で保存されます。これによって、
Linuxシステム上でのI/O負荷が大幅に減少し、スワップの発生頻度が抑えられます。
特に、組み込みデバイスや
ネットブック、さらにはSSDを使用するデバイスなど、さまざまなフラッシュベースのストレージデバイスにおいて、zswapの利点が活かされます。これは、
フラッシュメモリが有限の書き込み回数を持ち、スワップ領域として使われると急速に劣化してしまう特性によるものです。
内部機構
zswapは
Linuxカーネルの仮想メモリサブシステムに組み込まれており、frontswapと呼ばれるAPIを利用しています。frontswapは、異なるストレージタイプを抽象化し、スワップ領域として利用するためのメカニズムです。このため、zswapはfrontswap APIを用いてスワップアウトされたメモリページをインターセプトし、ページフォールトの際にはスワップ済みのページを同様に扱うことができます。
zswapは内部で、
Linuxカーネルのcrypto APIに基づく圧縮モジュールを活用しており、これによりメイン
CPUの負荷を軽減してハードウェア圧縮アクセラレータに処理を任せることが可能です。圧縮モジュールは、カーネルブートパラメータによって動的に設定できます。特に指定が行われない場合のデフォルトはLempel–Ziv–Oberhumer (LZO)圧縮アルゴリズムです。
また、zswapは利用可能な
メモリプールの最大サイズをsysfsパラメータで設定でき、これによりシステムRAMの何パーセントを占有可能かを指定することができます。プールが最大限に達するか、メモリ不足が発生した場合は、Least Recently Used (LRU)アルゴリズムに基づいてスワップデバイスへページが退避されます。この方法により、古いキャッシュページをスワップデバイスへ移し、新しいスワップページのキャッシュへのスペースを空けることができます。
さらに、zbudという特定用途向けメモリアロケータがzswap内で使用されており、圧縮ページの格納を効率化します。zbudは、物理メモリページごとに2つまでの圧縮ページを格納可能であり、これにより空き領域の結合や再利用も容易になります。ただし、メモリ使用率が低く、圧縮率が限られるといった欠点も抱えています。
歴史
zswapとzbudは、Seth Jenningsによって開発され、初めて発表されたのは2012年です。2013年までの開発の結果、コードベースは完成度が高まり、同年9月2日にリリースされた
Linuxカーネル3.11において公式に統合されました。その後、2014年には複数のスワップデバイスをサポートする機能も追加されました。
代替
zswapの代替技術としてはzramが挙げられます。この技術もメモリ上に圧縮スワップページを保存するもので、データの格納にRAMを使用します。zramは通常のスワップデバイスとして利用するためには、ユーザー空間での設定が必要であり、事前にスワップを配置しておく必要があります。一方、zswapは透明性がありユーザー設定なしで動作するため、スワップページをより効率的に管理できます。
最終的に、zswapは既に存在するスワップデバイスに依存しているのに対し、zramはスワップ領域が存在しない場合でも機能します。双方の特性に応じて、用途に応じた選択が必要です。
関連項目
出典
外部リンクとして、
Linux Transparent Memory Compressionに関する動画や、関連する文献も参照可能です。