monoの開発ブログ

zramでVPSのメモリ不足を緩和する

ここのところ、PCでメモリ不足を感じることもすっかりなくなりましたね。 しかし、安価なVPSやIaaSを使おうとすると、メモリ不足に悩まされることが少なくありません。 CPUやストレージが有り余っている状態で安易にスペックを上げるのは負けた気がするので、zramを導入して状況の緩和を図ることにしました。

zramは、メモリ上に圧縮された仮想ブロックデバイスを構築するLinuxカーネルの機能です。 zramのデバイスをswap領域に設定することで、スワップアウト時にデータが圧縮され、実際のメモリの大きさよりも多くの情報をメモリ上に置けるようになります。 データを圧縮、展開するコストは発生しますが、ディスクI/Oのコストと比べれば微々たるものなので、性能向上が見込めるというわけです。

zramを導入する前の私のサーバはこんな状態でした。 メモリを1GBしか搭載していないにもかかわらず、メモリ使用量が875MB、swap使用量が412MBのように合わせて1GBを超える状況が慢性的に続いており、明らかにメモリ不足と言えます。

$ free -m
             total       used       free     shared    buffers     cached
Mem:           993        875        117         17          2         78
-/+ buffers/cache:        795        198
Swap:         1020        412        608
$ swapon -s
Filename                                Type            Size    Used    Priority
/dev/vda5                               partition       1045500 422684  -1

この環境にzramをインストールします。 Ubuntu 14.04の場合、apt-getでインストールするだけで適切に設定するところまですべて勝手にやってくれるみたいです。

$ sudo apt-get install zram-config

インストールが完了したら、ディスクのswapを無効化してzramの効果を確認してみました。

$ sudo swapoff /dev/vda5
$ free -m
             total       used       free     shared    buffers     cached
Mem:           993        828        165         36          0         72
-/+ buffers/cache:        756        237
Swap:          496        420         76
$ swapon -s
Filename                                Type            Size    Used    Priority
/dev/zram0                              partition       254444  213564  5
/dev/zram1                              partition       254444  213620  5

なんと、ディスクのswapなしでも問題なく動いています! 約1.3GBのデータはそのままでは1GBのメモリには収まらないので、圧縮が効いていることがわかります。

実際にデータがどれだけ圧縮されているか確認してみましょう。

$ cat /sys/block/zram0/orig_data_size
195792896
$ cat /sys/block/zram0/compr_data_size
76715328

データの内容によって変わるとは思いますが、この環境では186MBのデータが73MBになっており、圧縮率は40%程度です。 これだけ縮んでくれるのであれば、メモリにかなり余裕が出てくるのではないでしょうか。

もちろん、これでも溢れる場合も考えられるので、実際に使う場合にはディスクのswapも有効にしておきます。 ディスクはPriorityが低くなっているので、zramの容量が足りている間はディスクが使われることはありません。

$sudo swapon /dev/vda5
$ free -m
             total       used       free     shared    buffers     cached
Mem:           993        852        141          8          1         46
-/+ buffers/cache:        805        188
Swap:         1517        445       1072
$ swapon -s
Filename                                Type            Size    Used    Priority
/dev/vda5                               partition       1045500 0       -1
/dev/zram0                              partition       254444  228168  5
/dev/zram1                              partition       254444  228000  5

zramを利用すると、圧縮と展開の処理が必要になるためにCPUへの負荷が高まると考えられます。 しかし、1台のVMに複数のアプリケーションを詰め込んで動かしている場合、はじめにも述べたように、プロセスを起動することでメモリを圧迫されるものの、それほどやることがなくCPUは暇をしているという状況も多いのではないでしょうか。 このような状況を考えると、少しCPUを使ってでもメモリの使用効率を高めてアプリケーションの集積度を上げられることはメリットがあると思います。