読者です 読者をやめる 読者になる 読者になる

解き放たれしソフトウェア

GNU/LinuxなどFLOSSについて書いてみるつもり

【Linux】zswap は本当に速いのか

Linux カーネルスワップの効率を上げるための方法に、 zram を使用する方法と、 zswap があります。 以前は zcache という圧縮をより全般的にかける機能もありましたが、今は廃止されています。

zram は、圧縮 RAM ディスクです。RAM ディスクに自動的に圧縮をかけるようにして消費容量を減らす機能です。( zram はブロックデバイスです。) ですから、この圧縮 RAM ディスクをスワップディスクとして活用するという発想があるのです。 最初からスワップアウトが起こることを前提にスワップアウト先を高速である RAM ディスクにして、圧縮で容量消費を減らそうというわけです。

zswap という手法は、スワップアウトの発生を減らすという発想です。 メモリ上のキャッシュを圧縮してスワップアウトを可及的に避ける、それでも溢れたらスワップアウトをするという機能です。 zswap はギリギリまで RAM 上にキャッシュを保持しますから、スワップアウト先には SSD や HDD のような補助記憶装置を用いることになるでしょう。

本当に効果的か?

ところで、 zram や zswap は、本当に、性能を高めるのでしょうか?

zram のスワップ用途に疑問

zram は RAM 上に一定容量を専有しますが、わざわざ圧縮をするくらいですから、RAM の搭載容量が足りないシステム上での逼迫した状況での利用もありうるかもしれません。 しかし、スワップアウトをそもそも減らす zswap を活用する方が先である気がします。

他方で RAM 容量に余裕があれば、そもそも RAM ディスクを圧縮する必要はないし、スワップアウトもあまり発生しないはずです。

ところで、スワップとして以外の RAM ディスクが必要な状況で、消費容量を減らしたいときには、 zram は効果的です。

zswap は「乾いた雑巾を絞る」印象

zswap は、スワップアウトはたまにだけ発生するような状況ならば、スワップアウトをさらに減らすという効果があるでしょう。 ただやはり、 RAM に余裕があればスワップアウトはほとんど発生しないのですよね。

おそらく、わざわざ圧縮をしてまでキャッシュやスワップの容量を減らすことで性能が高まるのは、CPU は速いが RAM は多くはないという状況だと思います。 圧縮・復元の処理に CPU などのリソースを消費しますから、CPU が遅ければかえって性能が下がるし、RAM が多ければ演算リソースのムダだと思われます。

近年は SSD が普及してきたので、たまにしか発生しないスワップアウトのためであれば SSDスワップアウトすれば足りて、 zswap で圧縮・復元する負荷の方が損だという考え方もありえます。

それでも必要な場面

近年は、 ARM の embbed や、 "Raspberry Pi" だとか、最近はチリメンというのもあるようですが、そういったリソースの少ないマシンもあります。 このようなマシンには、 RAM が足りなかったり、補助記憶装置が SD カード系などという、物凄く遅いものも少なくありません。

こうしたマシンでGentooを動かす猛者は自力でなんとかするでしょうからおいとくとして、多くはビルド済バイナリでOSをインストールするはずです。 そうなると、例えば Debian 系であったりFedora系であったりを動かすことになるかもしれません。 このときには、 zswap が効果的な状況も多くありえます。

かなりのディストリビューションは、 Linux カーネルを zswap 有効でビルドして配布しています(CONFIG_ZSWAP=y)。 ですので、ブート時のいわゆるカーネルパラメータに、 zswap.enabled=1 を追加して起動すれば、 zswap は有効になります。 Zswap - ArchWiki

また、圧縮・復元で消費する CPU リソースを抑えるための折衷案として、 lzo ではなく lz4 で圧縮することが考えられます。zswap.compressor=lz4

個別具体的に検証すべき

まず、 zswap 無しでシステムを動かして、スワップアウトの発生状況をみてみるべきです。

余裕があってスワップアウトが発生しないようであれば、黙って zswap を使わないままおいておいてかまわないと思います。 それなのに zswap を有効にしてしまうと、圧縮・復元のリソース消費で負荷と時間がムダにかかってかえって遅いということが起こりえます。

ちなみに、そもそもの Linux カーネルの現状のデフォルトでは、 zswap 無効です。 3.11で登場して以来ずっと(4.4.0の今でも)、 experimental という扱いになっています。 「性能が上がるらしいとネット上で書かれている」という理由で詳しいことは解らないけれど有効にした、なんてことはしない方がいいと思います。