ramzswap

linux 2.6.33にstaging扱いで追加されたデバイス"Compressed in-memory swap device (ramzswap)"というらしい。この説明で全てを言い尽しているような気もするが、実装が小さそうだったのでざっと眺めてみた。
メモリで構成するファイルシステムと言えばtmpfsとかが既にあるが、メモリに圧縮して保持する以外にも実装レイヤが違うのでかなり中身は単純だった。
ブロックデバイスとはいってもVFS経由で操作されることを考えていないようでblockデバイスとしての操作は、ioctlを受けつけるだけ。実際の読み書きはブロックデバイスレイヤからのリクエストで受けつける。
moduleロード時の初期化処理ではほとんど何もせず、デバイスノードを作ってからioctlで制御する。swapデバイスとしての初期化やサイズの変更などもioctl経由。ロードした瞬間から使えるわけではないのはちょっと面倒かな。
実ディスクの裏打ちを持つこともできるようだけど、物がswapだけに嬉しい局面がちょっと想像できなかった。
メモリアロケータは独自の実装を持っており、フラグメントしにくくてO(1)でアクセスできるのが売りらしい。 この中までは追えなかった。
圧縮はlzoで決め打ちだった。展開速度とオーバーヘッドで他に選択肢が無いからかもしれない。ベンチマークをしたときの圧縮率は4:1とあるので、まあまあか。
ベンチマークは開発サイトで幾つかとっているけど、普通はswapしないように動作させるもので敢えてswapを使うほどアプリを動かした上でパフォーマンスが劣化しませんよ、というのは何か数字を作っているような気もする。
ディスクのswapと併用するときは優先度に差を付けておけば、ramzswapから先に使われるので問題なさそう。
最近はメモリも潤沢だけど、何よりCPUコアが無駄に増えてきて圧縮にCPUサイクルを使っても十分にペイすることも多いのだろう。組み込み用途などの小メモリ環境では案外便利かもしれない。メモリサブシステムで圧縮をするよりは、デバイスドライバとして実装できる今回みたいな実装は影響が小さくていいかも