第11回 メモリ管理機能が強化されたHyper-VのDynamic MemoryWindows Server 2008 R2の真価(2/2 ページ)

» 2011年03月03日 00時00分 公開
[打越浩幸デジタルアドバンテージ]
前のページへ 1|2       

 それでは仮想マシンに対してDynamic Memory方式でメモリを割り当ててみよう。なお、Hyper-Vのインストールについてはここでは特に述べないが、インストール方法そのものは従来のWindows Server 2008 R2(RTM版)の場合と同じである。サーバ管理ツールを起動後、役割の追加で「Hyper-V」役割を追加しておくだけで、Dynamic Memory機能も同時にインストールされる。Dynamic Memoryの設定は、仮想マシンごとのメモリ設定画面で行う。

Hyper-Vサーバ管理ツールのアップグレード

 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のパラメータを設定する

 Dynamic Memoryの設定を確認/変更するためには、Hyper-Vマネージャで仮想マシンを右クリックし、ポップアップ・メニューから[設定]を選択する。仮想マシン接続ウィンドウで[ファイル]−[設定]メニューを実行してもよい。なおこの設定変更は、仮想マシンが停止した状態でしか実行できない。実行中の場合はいったんシャットダウンしてから作業する。

 仮想マシンの設定画面が開いたら、左ペインの[ハードウェア]グループから[メモリ]項目を選択する。Dynamic Memoryの設定は次の画面のとおりである。動的に割り当てる場合は、初期値と最大値、バッファ・パラメータを指定する。従来の固定的なメモリ割り当ては、上側の[静的]の方に相当する。

Dynamic Memoryの設定
Dynamic Memoryを利用すると、必要なメモリだけを仮想マシンに割り当てることができる。
  (1)これを選択する。
  (2)デフォルトはこちら。従来はこの割り当て方法しかなかった。
  (3)仮想マシンに固定的に割り当てるメモリ・サイズ。古いHyper-Vマネージャから接続すると、この値しか見えないし、これしか設定できない。
  (4)Dynamic Memoryを利用する場合はこちらを選択する。
  (5)メモリ・サイズの初期値。仮想マシン起動直後に割り当てられるメモリ・サイズ。
  (6)最大値。デフォルトでは64Gbytes(65,536Mbytes)となっているが、実際には、割り当てるメモリが不足すれば要求は拒否され、ここまで増大することはない。
  (7)空き領域がここで指定した割合のあたりまで低下すれば、新たにメモリ領域を割り当てるし、多過ぎればシステムに返却する(ことがある)。詳細は以下の解説参照。
  (8)どの仮想マシンに優先的にメモリを割り当てるかを調整するパラメータ。

 以下、それぞれの項目について解説しておく。

■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つの方法がある。

  • Hyper-Vマネージャで確認する
  • パフォーマンス・カウンタで確認する

 以下、いくつか実行中の例を見てみよう。

 まず以下は、初期メモリ・サイズとして512Mbytes割り当てた仮想マシンを起動した直後の状態である。

初期状態
起動直後の仮想マシンの状態。
  (1)起動した仮想マシン。
  (2)この仮想マシンに本当に割り当てられているメモリ・サイズ。(1)の8割程度になっている。
  (3)いわゆるコミット・サイズ。使用中のメモリ・サイズ。(2)との差が未使用メモリ・サイズ。
  (4)ゲストOSから見た仮想マシンのメモリ・サイズ。

 いくつかプログラムを実行してメモリを消費した状態が次の画面である。ゲストOSから見た物理メモリ・サイズが、初期状態から拡大していることが分かるだろう。実行中にメモリ・サイズが動的に変わっているのである。なおここで増えた分は、ハイパーバイザ(親パーティション)側のタスク・マネージャで見ると、空きメモリ・サイズが減少している。

メモリが拡大した状態(1)
メモリを多く使うアプリケーションをいくつか起動した状態。
  (1)現在割り当てられているメモリ・サイズ。
  (2)使用中のメモリ・サイズ。(1)の8割程度になっている。
  (3)当初の512Mbytesではなく、増えている。このように仮想マシンのメモリ・サイズは動的に変わる。

 さらにいくつか仮想マシンを起動してプログラムを実行し、もうこれ以上メモリが要求できなくなった状態が次の画面である。各仮想マシンのメモリ・サイズはもうこれ以上増えず、必要に応じてページング機能が働いている(つまり、ゲストOSが自分自身でスワップアウトして、メモリをやりくりしている。そのため、かなり遅くなっている)。このとき親パーティション側の空きメモリ・サイズは500Mbytes程度になってしまっている(親パーティションのメモリを全部使い切らずに、いくらか残すように制御されている)。

メモリが拡大した状態(2)
複数の仮想マシンでメモリを使っている状態。ホストPCの空きメモリいっぱいまで仮想マシンを実行してみた。
  (1)それぞれの仮想マシンに割り当てられているメモリ・サイズ。
  (2)仮想マシンで実際に利用されているメモリ・サイズ。
  (3)Windows XPのように、Dynamic Memoryが利用できないゲストOSの場合は、ここは空欄のままになる。ゲストOSから見たこの仮想マシンのメモリ・サイズは、起動から終了まで、ずっと同じである。
  (4)これは親パーティションのタスク・マネージャの画面。このコンピュータには14Gbytesのメモリが搭載されている。
  (5)親パーティションの空きメモリは400Mbytes程度しか残っていない(これ以上減ることはないようだ)。

 この例ではホスト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の持つメモリが、仮想マシン間で効率的に使われている。

メモリを解放した状態
アプリケーションの実行を終了して、メモリを解放した状態。ゲストOSで大量の未使用メモリが出ると、それはハイパーバイザへ返却される。
  (1)現在割り当てられているメモリ・サイズ。先ほどの6.6Gbytesから700Mbytes弱まで減っている。
  (2)実際に使用しているメモリ・サイズ。(1)の8割程度になっている。
  (3)ゲストOSから見たメモリ・サイズは大きくなったまま(状況によっては、このサイズが小さくなることもある)。
  (4)空きメモリがほとんどない。でも7Gbytes近く使っているわけではない。バルーン・ドライバによって、ほとんどの領域はハイパーバイザへ返却されている。

 最後にパフォーマンス・モニタで仮想マシンのメモリの状態を確認しているところを示しておく。Dynamic Memoryが有効な場合は、パフォーマンス・カウンタに次の2つのグループが追加されている。

  • Hyper-V Dynamic Memory Balancer(メモリの割り当てを行うメモリ・バランサのカウンタ)
  • Hyper-V Dynamic Memory VM(各仮想マシンごとのカウンタ)

 それぞれ、次のようなカウンタを含んでいる。

パフォーマンス・カウンタ 説明
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カウンタ・グループのパフォーマンス・カウンタ

 実際のカウンタの画面を次に示す。

パフォーマンス・モニタで確認しているところ
Dynamic Memory関連のカウンタ値を表示させている。これによってメモリ割り当て状態の詳細を知ることができる。


 今回はメモリの利用効率を向上させるHyper-VのDynamic Memoryについて解説した。次回は仮想環境でGPUを使った3Dグラフィックスを実現するRemoteFX機能について解説する。

【更新履歴】

【2011/03/25】公開当初、親パーティションのために予約するメモリ・サイズのレジストリ名を「MemReserve」としておりましたが、正しくは「MemoryReserve」でした。お詫びして訂正させていただきます。



「  Windows Server 2008 R2の真価 ―― 実質新世代サーバOSの真の実力を知る ―― 」のインデックス

  Windows Server 2008 R2の真価 ―― 実質新世代サーバOSの真の実力を知る ―― 

前のページへ 1|2       

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。