それでは仮想マシンに対してDynamic Memory方式でメモリを割り当ててみよう。なお、Hyper-Vのインストールについてはここでは特に述べないが、インストール方法そのものは従来のWindows Server 2008 R2(RTM版)の場合と同じである。サーバ管理ツールを起動後、役割の追加で「Hyper-V」役割を追加しておくだけで、Dynamic Memory機能も同時にインストールされる。Dynamic Memoryの設定は、仮想マシンごとのメモリ設定画面で行う。
Hyper-Vの役割を追加したら、次は[管理ツール]の[Hyper-V マネージャ]を開いてHyper-Vの仮想マシンを管理/設定するが、このとき必ずSP1のHyper-Vマネージャを利用しなければならない。SP1を適用していないWindows Server 2008 R2上のHyper-VマネージャでWindows Server 2008 R2 SP1のHyper-Vサービスを管理することはできるが、この状態ではDynamic Memory機能は設定できない(従来の古いままのメモリ設定画面が表示される。Dynamic Memory関連の項目は表示されない)。リモートからDynamic Memoryを管理したい場合は、必ずWindows Server 2008 R2 SP1上のサーバ管理ツールを使う必要がある。Windows Server 2008 R2に管理ツールだけをインストールする方法については、以下の記事を参照していただきたい。
なおWindows 7からリモートのHyper-Vサービス(Dynamic Memory)を管理することもできるが、そのためにはWindows 7 Enterprise/Professional/Ultimate Edition上にRSAT(Remote Server Administration Tools)というリモート・サーバ管理ツールをインストールする。具体的な方法については以下の記事などを参照していただきたい。
ただしこのRSAT管理ツールは、原稿執筆時点ではWindows 7のSP1用はまだリリースされておらず、Service Pack未適用のWindows 7(RTM版のWindows 7)にしかインストールできない。そのためRSATツールをインストールする正しい手順は、まずSP未適用のWindows 7にRSATツールを適用し、その後Windows 7にSP1を適用しなければならない(この注意書きは、上記ダウンロード・サイトの英語版のページに記述されている)。SP1適用済みのWindows 7や、SP1が統合されたWindows 7を利用している場合は、SP1向けのRSATツールがリリースされるまで待つ必要がある。
Dynamic Memoryを利用するためには、ゲストOSにインストールされている統合コンポーネントをSP1のものにアップグレードする必要がある。ゲストOSを新規インストールした場合は、その最終段階でSP1の統合コンポーネントをインストールしているであろうからそのままでよい。SP1よりも前のHyper-V環境で作成した仮想マシン(の仮想ディスク)を利用する場合は、仮想マシンを起動後、[編集]メニューの[統合サービス セットアップ ディスクの挿入]を実行して、統合コンポーネントを更新しておく。更新後、一度仮想マシンを再起動し、その後シャットダウンする。
なお統合コンポーネントをアップグレードすると、その仮想ディスク・ファイルは以前のHyper-V環境ではもう利用できなくなるので注意していただきたい。SP1適用済みとSP1未適用のHyper-V実行環境が混在している場合は、それぞれの仮想ディスク・ファイル(およびスナップショットや状態保存ファイル)を別々に管理する必要がある。
Dynamic Memoryの設定を確認/変更するためには、Hyper-Vマネージャで仮想マシンを右クリックし、ポップアップ・メニューから[設定]を選択する。仮想マシン接続ウィンドウで[ファイル]−[設定]メニューを実行してもよい。なおこの設定変更は、仮想マシンが停止した状態でしか実行できない。実行中の場合はいったんシャットダウンしてから作業する。
仮想マシンの設定画面が開いたら、左ペインの[ハードウェア]グループから[メモリ]項目を選択する。Dynamic Memoryの設定は次の画面のとおりである。動的に割り当てる場合は、初期値と最大値、バッファ・パラメータを指定する。従来の固定的なメモリ割り当ては、上側の[静的]の方に相当する。
以下、それぞれの項目について解説しておく。
■RAM(単位:Mbytes)
これは固定的にメモリを割り当てる場合の仮想マシンのメモリ・サイズ設定。従来のHyper-Vマネージャで接続すると、この値だけが見える。
■スタートアップRAM(単位:Mbytes)
仮想マシンの初期メモリ・サイズ。必要に応じてメモリ・サイズは増減できるので、従来のように大きな値にしておく必要はない。初期サイズの推奨値は以下のとおりだが(これはDynamic Memoryのドキュメントなどに記述されている値)、このあたりは環境に合わせて変更すればよい。「スタートアップ」と書かれているが、メモリを解放した場合の最小値にもなっている。ほかの仮想マシンに優先的にメモリを回すと、このサイズまで下がることがあるので、必要ならばもっと大きなサイズにする。そのためには、ある程度実環境で仮想マシンを使い、実際に必要なサイズを調査する。
ゲストOS | 初期サイズ |
---|---|
Windows Server 2008 R2 Windows Server 2008 Windows 7 Windows Vista |
512Mbytes |
Windows Server 2003 R2 Windows Server 2003 |
128Mbytes |
スタートアップRAMサイズの推奨値 これは起動時のメモリ・サイズであるだけでなく、下限でもある。必要ならもっと大きな値に設定すればよい。 |
■最大RAM(単位:Mbytes)
これは、メモリ・サイズの最大値。デフォルトでは64Gbytesとなっており、事実上無制限に拡大することになる。とはいえ前述したように、実際のメモリ・サイズ以上に拡大することはないので、このままでもよいだろう。最大値が分かっている場合は、ほかの仮想マシンに優先的にメモリを回すために、もっと小さな値に制限してもよいだろう。
■メモリ・バッファ(5〜95%)
少し分かりづらいが、これはどのくらいのメモリをあらかじめ用意しておくか(未使用領域として確保しておくか)を設定するパラメータである。Mbytes単位ではなく、仮想マシンにおけるメモリ領域全体に対するパーセンテージで指定する。
Dynamic Memoryでは、空きメモリ領域がある程度以下のサイズ(割合)になったら、ハイパーバイザにメモリを要求するようになっている。そのタイミングや要求量などを決めるのがこのパラメータである。
デフォルトでは20%となっているが、これは、空きメモリ領域のサイズが全体の20%になるように、メモリを管理するという意味である。例えばゲストOSで使用しているメモリ・サイズ(コミット・サイズからバルーニングによって未使用になっている部分を除いたもの。TIPS「タスク・マネージャのパフォーマンス・タブの見方(Windows 7/Windows Server 2008 R2編)」参照)が800Mbytesなら、(800÷(100%−20%))=1000Mbytesなので、システム全体で1000Mbytesになるようにメモリを要求する。このとき、割り当て済みメモリ・サイズが900Mbytesなら、全体で1000Mbytesになるように、あと100Mbytesのメモリをハイパーバイザに要求する。
■メモリ優先度
これはメモリを要求する複数の仮想マシンが存在する場合に、どれを優先するかを決めるためのスライダである。同じようにメモリを要求する仮想マシンがあった場合、優先度が高い仮想マシンの方に多く割り当てられるようになっている。デフォルトでは、すべての仮想マシンが同じ優先度になっている。
Dynamic Memoryに関する設定は以上である。あとは仮想マシンを起動すれば、まずは初期設定メモリ・サイズが割り当てられるが、その後は必要に応じてメモリが追加割り当てされる。仮想マシンに割り当てられているメモリはタスク・マネージャで確認できるが、実はこれは正確ではない。最初に述べたように、仮想マシンに割り当てられたメモリは増えるだけでなく、バルーニングによって、ハイパーバイザ(親パーティション)へ返却されることがあるからだ。アドレス空間を見ると、メモリ・マップの途中に穴が開いている状態なので、その分を除外しなければならない。
実際に割り当てられているメモリ・サイズを正確に知るには次の2つの方法がある。
以下、いくつか実行中の例を見てみよう。
まず以下は、初期メモリ・サイズとして512Mbytes割り当てた仮想マシンを起動した直後の状態である。
いくつかプログラムを実行してメモリを消費した状態が次の画面である。ゲストOSから見た物理メモリ・サイズが、初期状態から拡大していることが分かるだろう。実行中にメモリ・サイズが動的に変わっているのである。なおここで増えた分は、ハイパーバイザ(親パーティション)側のタスク・マネージャで見ると、空きメモリ・サイズが減少している。
さらにいくつか仮想マシンを起動してプログラムを実行し、もうこれ以上メモリが要求できなくなった状態が次の画面である。各仮想マシンのメモリ・サイズはもうこれ以上増えず、必要に応じてページング機能が働いている(つまり、ゲストOSが自分自身でスワップアウトして、メモリをやりくりしている。そのため、かなり遅くなっている)。このとき親パーティション側の空きメモリ・サイズは500Mbytes程度になってしまっている(親パーティションのメモリを全部使い切らずに、いくらか残すように制御されている)。
この例ではホストPCの空きメモリは400Mbytes程度しか残っていないが、アプリケーションの実行などのためにもっと多くのメモリを残しておきたければレジストリを設定する(この設定による効果についてはTIPS「Hyper-VのDynamic Memoryで親パーティション用のメモリを予約する」参照)。
【2011/03/25更新】当初公開した記事では、以下の表において、レジストリの値の名前を「MemReserve」と記述しておりましたが、正しくは次のように「MemoryReserve」でした。「MemReserve」では何の効果もありませんので、すでに設定済みの場合は設定変更をお願いします。
項目 | 内容 |
---|---|
キー | HKEY_LOCAL_MACHINEの \SOFTWARE\Microsoft\Windows NT\CurrentVersion\Virtualization |
値の名前 | MemoryReserve |
型 | REG_DWORD |
値の内容 | 親パーティションのために残しておくメモリのサイズ(Mbytes単位 |
親パーティションのために残しておくメモリ・サイズの指定 |
なお以下のレポートによれば、このような設定をしなくても、ホストPCの搭載メモリ・サイズに応じて、いくらかのメモリは残るようになっているようである。
次の画面は、上の状態から仮想マシンをいくつかシャットダウンし、さらにアプリケーションなどもいくつか終了させたところである。仮想マシンに割り当てられていたメモリが解放されている。このように、ホストPCの持つメモリが、仮想マシン間で効率的に使われている。
最後にパフォーマンス・モニタで仮想マシンのメモリの状態を確認しているところを示しておく。Dynamic Memoryが有効な場合は、パフォーマンス・カウンタに次の2つのグループが追加されている。
それぞれ、次のようなカウンタを含んでいる。
パフォーマンス・カウンタ | 説明 |
---|---|
Added Memory | VMに追加された累積メモリ容量 |
Available Memory | ノード上に残っているメモリ容量 |
Average Pressure | バランサ・ノードの平均負荷 |
Memory Add Operations | 追加操作の総数 |
Memory Remove Operations | 削除操作の総数 |
Removed Memory | VMから削除された累積メモリ容量 |
Hyper-V Dynamic Memory Balancerカウンタ・グループのパフォーマンス・カウンタ |
パフォーマンス・カウンタ | 説明 |
---|---|
Added Memory | VMに追加された累積メモリ容量 |
Average Pressure | VMの平均負荷 |
Current Pressure | VMの現在の負荷 |
Guest Visible Physical Memory | ノードで表示されるメモリ容量 |
Maximum Pressure | VMの最大負荷帯域 |
Memory Add Operations | VMに対する追加操作の総数 |
Memory Remove Operations | VMに対する削除操作の総数 |
Minimum Pressure | VMの最小負荷帯域 |
Physical Memory | VMの現在のメモリ容量 |
Removed Memory | VMから削除された累積メモリ容量 |
Hyper-V Dynamic Memory VMカウンタ・グループのパフォーマンス・カウンタ |
実際のカウンタの画面を次に示す。
今回はメモリの利用効率を向上させるHyper-VのDynamic Memoryについて解説した。次回は仮想環境でGPUを使った3Dグラフィックスを実現するRemoteFX機能について解説する。
【2011/03/25】公開当初、親パーティションのために予約するメモリ・サイズのレジストリ名を「MemReserve」としておりましたが、正しくは「MemoryReserve」でした。お詫びして訂正させていただきます。
Copyright© Digital Advantage Corp. All Rights Reserved.