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 cachedMem: 993 875 117 17 2 78-/+ buffers/cache: 795 198Swap: 1020 412 608$ swapon -sFilename 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 cachedMem: 993 828 165 36 0 72-/+ buffers/cache: 756 237Swap: 496 420 76$ swapon -sFilename 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_size195792896$ cat /sys/block/zram0/compr_data_size76715328
データの内容によって変わるとは思いますが、この環境では186MBのデータが73MBになっており、圧縮率は40%程度です。 これだけ縮んでくれるのであれば、メモリにかなり余裕が出てくるのではないでしょうか。
もちろん、これでも溢れる場合も考えられるので、実際に使う場合にはディスクのswapも有効にしておきます。 ディスクはPriorityが低くなっているので、zramの容量が足りている間はディスクが使われることはありません。
sudo swapon /dev/vda5
$ free -m total used free shared buffers cachedMem: 993 852 141 8 1 46-/+ buffers/cache: 805 188Swap: 1517 445 1072$ swapon -sFilename 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を使ってでもメモリの使用効率を高めてアプリケーションの集積度を上げられることはメリットがあると思います。