仮想マシンのメモリ割り当てを増減させる場合、通常は仮想マシンを停止した上で行わなければなりません。
これを仮想マシンを起動したまま、動的にメモリの割当を変更するするのがメモリバルーニング(動的追加)です。

「日中は仮想マシンのアプリサーバにメモリを多く割り当て、夜間のバッチ時間帯にはそのメモリを今度はバッチサーバにメモリを割り当てる」
このようなメモリの動的追加を行って、限られた物理メモリの有効活用を行うといった事は、エンタープライズサーバー環境ではよく行われています。

VirtualBoxでは バージョン3.2からこの機能が実装されました。

メモリバルーニングの条件

このような便利なメモリーバルーニングですが、この機能を使うには以下の条件を満たしておく必要があります。

  • 64bitのホストOSであること
  • MacOSX以外のホストOSであること
  • ゲストOSにGuestAdditionsをインストールしてあること

メモリバルーニングの注意点

メモリのバルーニングが要求されると、ゲストOSにインストールされたGuest Additionsが、ゲストOSに割り当てられた物理メモリのアクセスを制限します。
これにより、ゲストOSはそのメモリ領域を使用することがなくなり、VirtualBoxのメモリバルーニング機能はこのメモリ領域を再使用し、別の仮想マシンに与えることができます。

このようにVirtualBoxのメモリバルーニング機能は、ゲストOS同士でメモリを融通することができます。

注意すべきは、融通するメモリ領域はバルーニングメカニズムを介してVirtualBoxで再使用可能なだけで、ホストOSへの空きメモリとして返されることはありません。
実行中のゲストからメモリバルーニングでメモリ割り当てを減らしても、ホストOS上の空きメモリ量は増えません。

あくまでゲストOS同士でのみ、空きメモリを融通する事ができます。

メモリバルーニングの実行

メモリバルーニングによるメモリの増減の実行は、VBoxmanageコマンドで行います。

VBoxManage controlvm "VM name" guestmemoryballoon <n>

<n>の部分はメモリ割り当てをメガバイト単位で指定します。

crontrolvmオプションでは再起動すると設定が消えてしまうので、永続的に設定を行う場合にはmodifyvmコマンドを実行します。

VBoxManage modifyvm "VM name" --guestmemoryballoon <n>

メモリバルーニングのテスト

さて、では実際にメモリバルーニングのテストを行ってみます。

用意したゲストOSは、OSがWindowsXPで割り当てメモリが768MBのゲストマシンです。
起動後、十分にアイドルになるまで放置した時のタスクマネージャーの状況が以下になります。

VBoxmanage showvminfo コマンドでバルーニングの状況が確認できます。

>VBoxManage.exe showvminfo {b24b27ca-72ba-4d35-8fad-d79b0ce79e99}

Guest:

Configured memory balloon size:      0 MB
OS type:                             WindowsXP
Additions run level:                 3
Additions version:                   4.1.2 r73507

現状を把握したところで、メモリバルーニングを行ってみます。
試しに512MBを設定してみます。

VBoxManage.exe controlvm {b24b27ca-72ba-4d35-8fad-d79b0ce79e99} guestmemoryballoon 512

すると仮想マシンのページファイルの使用量が跳ね上がり、タスクマネージャーが以下のようになりました。

バルーニングの状況も確認してみます。

>VBoxManage.exe showvminfo {b24b27ca-72ba-4d35-8fad-d79b0ce79e99}

Guest:

Configured memory balloon size:      512 MB
OS type:                             WindowsXP
Additions run level:                 3
Additions version:                   4.1.2 r73507

balloon sizeが512MB増えました。

状況をまとめると以下のようになります。

  1. タスクマネージャーの仮想メモリの合計や、システムのプロパティでみるOSが認識してるメモリサイズには変更がありませんでした。
  2. 仮想メモリの利用可能領域を見てみると 503208 -> 7384 に減少し、その差分は 495824 となり、利用可能な空きメモリが約484MB分減りました。
  3. ページファイルは 313632 -> 814528 に増加し、その差分 500896 となり、ページファイルが約489MB増えるました。

上記から、メモリバルーニングで減った仮想メモリ分の領域をページファイルから補完し、OSからみた仮想メモリの量に変化が無いようにしている?と考えられますが、ホントのところはどうなんでしょう。詳しい方がいたら教えて下さい。

バルーニングしたメモリの割り当て方がわからない

と、ここでバルーニングして余ったメモリを別の仮想マシンに割り当てようとしたのですが、やり方がよくわかりませんでした。

guestmemoryballoonオプションに-(マイナス)で指定すればメモリを増やすことができるのかとおもいきや、エラーで怒られました。

英文のマニュアルを読んでも特に記述がなく、他になにかオプションがあるのか、別のコマンドを使うのか。
現状では仮想マシンからメモリを剥ぎ取るしか出来ない状況です(笑)

やり方をご存じの方がいましたら、教えていただけませんか。