前回、無用なトラブルを避けるつもりで無難な選択をした結果、却ってロクでもない目に遭ったようだという話を書きました。
Hyper-V + Ubuntuなんてメジャーな組み合わせでは、そんなこと気にせずとも最新の環境でちゃんとうまくいくように作られているのですね…。そりゃそうだ。
で当然気になるのがもう一つの無難な(つもりの)選択、動的メモリです。
動的メモリもあえて使わない設定にしていたのですが、これもいらない配慮なんだよねと。
そんなわけで動的メモリも設定してみました。
動的メモリを試すにあたっては、ホストWindows8.1のタスクマネージャーでメモリ割り当てを確認しながら進めました。Hyper-Vマネージャーの表示でも確認できますけどね。
まず仮想マシンを起動していないときのメモリ割り当てはこんな感じ。
ここで固定メモリ2048Mbytesの設定で仮想マシンを起動します。するときれいに2Gbytes増えます。
一旦仮想マシンを落として動的メモリを設定します。スタートアップRAMは、グッと減らして512Mbytesにしてみました。
設定値を簡単に説明すると、メモリの割り当ては最小RAMと最大RAMの値の範囲で必要に応じて変動する、ただしメモリバッファー分だけ余裕をとる。起動時はまずスタートアップRAMの値だけ割り当てられる、ということです。
仮想マシンを起動してみると、あっさりメモリ割り当てが変わりました。やっぱり…。動的メモリは当たり前に使えるものなのね。
sshから入って操作してみたけれど、特に不具合は無し。
こんなきっちり設定通りになるものかと疑問を感じつつ。起動直後はぴったりスタートアップメモリ設定値の0.5Gbytesだけ割り当てられているようです。
これでもし仮想マシン上でメモリの需要があった場合、最大メモリ設定値の4Gbytesまでメモリ使用量が上がるはずですよね。
仮想マシン上で以下のプログラムをブン回して検証してみました。
~/work>$ cat memeater.c #include <stdlib.h> void main(void) { while (malloc(1024 * 1024) != NULL) {} return; } ~/work>$ cc -o memeater memeater.c ~/work>$ ./memeater Killed ~/work>$
最後はOOM Killerに落とされた?ぽい。ですが、おもしろい挙動を見せてくれました。
何か怖いくらい理屈通りの動きをしますね。しっかり4Gbytesを消費したところで頭打ちになったみたいです。
でも感心したのはここから。このまま5分ほど放置したら、
きっちりmemeaterの浪費していたメモリが返却されました!これ素晴らしい。ここのアルゴリズムってどうなっているのでしょうね。
Hyper-Vちょっと好きになったな。