いわゆる自宅サーバーの機器を更新し、これを機にソフトも KVM の上に載せてみることにしました。
用途と向きによって仮想サーバーを切り分けます。ホストも複数のゲストも、ぜんぶ Debian で同じバージョンです。ネットの検索によって得た知識でも何とかなります。
当初気づかずに、後から「こういうのがあるのか」と気づいたのが、KSM (Kernel Samepage Merging) でした(解説はたとえば Linux カーネル共有メモリーの徹底調査)。
KVM on Debian Squeeze – My Notes を参考に設定しました。
ホストとゲストの両方で /etc/rc.local を編集し、次を追加します。
echo 1 > /sys/kernel/mm/ksm/run echo 300 > /sys/kernel/mm/ksm/sleep_millisecs
再起動後、/sys/kernel/mm/KSM/pages_sharing がゼロより大きな値になっていれば、有効になっています。
KSM は使わないほうがいい?
さて、はじめ気づかなかった KSM についての情報に行き当たったのは、とりあえずしばらく動かしていると、ゲストOSが徐々にメモリを食いつぶしていくという現象をどうにかしたいと思って調べてみたからです。 そこで上記のように KSM を有効にしてみたのですが、引き続き検索していると、「KVMで複数VMを起動してVM間の相互作用を減らしたいときに考えること 」という記事を見つけました。
- メモリはオーバーコミットしない
- メモリをオーバーコミットするとろくなことがありません。なので要るだけ積みあげます。安いし。
- 特にゲストOSがlinuxの場合、メモリはあるだけ使おうとする。本来だとキャッシュとしての有効活用になるキャッシュを積極的に使う戦略が、メモリオーバーコミット環境下ではswapを多発させる原因になってしまう
うーむ。これが原因かもしれません。個々のゲストはさほど深刻な負荷があるわけではなし、一方が急に働くことになっても他方はそれほどでもないことがほとんどなので、個々のゲストのメモリ割り当てを、ほぼ実メモリと同じくらい、としていました。すなわち、ゲストに割り当てたメモリを合計すると実メモリの数倍になっていました。しかし、この記述によると
- メモリは足りてるはずなのでKSMは停止する
確かに KSM はホストに負荷がかかるので、動かさずに済むならそのほうがいいかもしれません。
もうしばらく様子を見ながら(まだ理解できていないことも多いし)、考えたいと思います。