zramでVPSのメモリ不足を緩和する
ここのところ、PCでメモリ不足を感じることもすっかりなくなりましたね。 しかし、安価なVPSやIaaSを使おうとすると、メモリ不足に悩まされることが少なくありません。 CPUやストレージが有り余っている状態で安易にスペックを上げるのは負けた気がするので、zramを導入して状況の緩和を図ることにしました。
zramは、メモリ上に圧縮された仮想ブロックデバイスを構築するLinuxカーネルの機能です。 zramのデバイスをswap領域に設定することで、スワップアウト時にデータが圧縮され、実際のメモリの大きさよりも多くの情報をメモリ上に置けるようになります。 データを圧縮、展開するコストは発生しますが、ディスクI/Oのコストと比べれば微々たるものなので、性能向上が見込めるというわけです。
zramを導入する前の私のサーバはこんな状態でした。 メモリを1GBしか搭載していないにもかかわらず、メモリ使用量が875MB、swap使用量が412MBのように合わせて1GBを超える状況が慢性的に続いており、明らかにメモリ不足と言えます。
この環境にzramをインストールします。
Ubuntu 14.04の場合、apt-get
でインストールするだけで適切に設定するところまですべて勝手にやってくれるみたいです。
インストールが完了したら、ディスクのswapを無効化してzramの効果を確認してみました。
なんと、ディスクのswapなしでも問題なく動いています! 約1.3GBのデータはそのままでは1GBのメモリには収まらないので、圧縮が効いていることがわかります。
実際にデータがどれだけ圧縮されているか確認してみましょう。
データの内容によって変わるとは思いますが、この環境では186MBのデータが73MBになっており、圧縮率は40%程度です。 これだけ縮んでくれるのであれば、メモリにかなり余裕が出てくるのではないでしょうか。
もちろん、これでも溢れる場合も考えられるので、実際に使う場合にはディスクのswapも有効にしておきます。 ディスクはPriorityが低くなっているので、zramの容量が足りている間はディスクが使われることはありません。
zramを利用すると、圧縮と展開の処理が必要になるためにCPUへの負荷が高まると考えられます。 しかし、1台のVMに複数のアプリケーションを詰め込んで動かしている場合、はじめにも述べたように、プロセスを起動することでメモリを圧迫されるものの、それほどやることがなくCPUは暇をしているという状況も多いのではないでしょうか。 このような状況を考えると、少しCPUを使ってでもメモリの使用効率を高めてアプリケーションの集積度を上げられることはメリットがあると思います。