~Windows Server 2008 R2 SP1 Beta版 検証の豆情報~
これまでHyper-Vでは、仮想マシンへメモリ容量を固定的に割り当てていたため、使用していないメモリは仮想マシン上で無駄なリソースとなっていました。これに対しWindows Server 2008 R2 SP1では、Dynamic MemoryというHyper-Vのメモリ管理機能によって、無駄なリソースが発生しないように、仮想マシン間で動的かつ安全に割り当てるメモリ容量を調整できるようになります。
富士通はベータ版の段階から、Dynamic Memoryによって動的にメモリ容量が調整された際に目に見えないボトルネックになる部分がないか検証を重ねています。そのなかで富士通はNonpagedPoolに関連して、システムが不安定になる問題等をいろいろ経験したため、Dynamic Memoryによる影響がないか着目しました。
今回はDynamic Memoryの概要と、ベータ版検証で着目したNonpagedPoolの動作について紹介します。
Dynamic Memoryの設定項目には、仮想マシンが使用するメモリ容量の下限値(StartupRAM)と上限値(MaximumRAM)があり、仮想マシンのメモリ容量をStartupRAMで起動し、その後必要に応じてMaximumRAMまで増やすことができます(図1参照)。また、増やしたメモリ容量を減らすことも可能なため、仮想マシンが使用していないメモリを回収し、他の仮想マシンに割り当てることができます。Dynamic Memoryはこのように動的にメモリ容量を増減し、常に仮想マシン上のゲストOSが必要とするメモリ容量で仮想マシンを運用することができます。
図1 状況に応じたメモリ容量の増加イメージ
さらに、仮想マシンに対してメモリを割り当てる優先度を設け、どの仮想マシンが優先してメモリを増加させるか決められます。すべての仮想マシンを起動するのに十分な物理メモリ容量がない場合、優先度の低い仮想マシンから空きメモリを回収し、優先度の高い仮想マシンへ割り当てて新たな仮想マシンを起動することができます(図2参照)。
図2 優先度に応じたメモリの回収と追加イメージ
OSの仕様でNonpagedPoolの上限値は、システム起動時のメモリ容量をもとに決定されます。実際の上限値は表1のとおりです。
OS | NonpagedPoolの上限値 | |
---|---|---|
32-bit | 64-bit | |
Windows XPおよびWindows Server 2003 / 2003 R2 | 物理メモリが1.2GB以下では32MB~256MB | 物理メモリ1MBあたり400KB(ただし最大128GBまで) |
物理メモリが1.2GB超では256MB | ||
Windows Vista/Windows 7およびWindows Server 2008 / 2008 R2 | 物理メモリの75%(ただし最大2GBまで) | 物理メモリの75%(ただし最大128GBまで) |
(参考元:WindowsクライアントTechCenter)
上記の仕様を踏まえ、富士通はシステム起動後Dynamic Memoryによって動的にメモリが増加しても、NonpagedPoolの上限値は増加しないのではと考えました。そこで実際にNonpagedPoolの上限値を測定し、増加するのかを確認しました。
測定環境としてWindows Server 2003 R2(64-bit)でStartupRAMを512MBに指定した仮想マシンを用いました。(NonpagedPoolの上限値は、表1に従ってメモリ1MBあたり400KBと計算し、205MBとなります。)
この環境でメモリ領域を確保するテストスクリプトを実行し、メモリ増加前後でのNonpagedPoolの上限値を測定し(※1)、比較しました(図3参照)。
図3 Windows Server 2003 R2(64-bit)におけるメモリ増加前後のNonpagedPool上限値の比較
(1)プロセスの詳細情報を取得するツールであるProcess Explorerを使用して測定しました。
図3で示したとおり、Dynamic Memoryによってメモリが増加しても、NonpagedPoolの上限値は増加しないことを確認しました。
次に、Dynamic Memoryによりメモリが増加してもNonpagedPoolの上限値が増加しないことから、メモリ総量に比べ小さいサイズになりOSの動作に影響があるのではないかと考え、簡単なWeb負荷テストを行って、実際にNonpagedPoolの使用量を測定しました(図4、表2参照)。
測定時のWebサーバの状態は以下のとおりです。
図4 NonpagedPool使用量の測定
マシン | OS | CPU | CPU数 | |
---|---|---|---|---|
Windows Vista/Windows 7およびWindows Server 2008 / 2008 R2 | WindowsServer 2008 R2 Datacenter | Intel® Xeon® CPU E5520 2.27GHz | 16 (4コア + HyperThreading 搭載のCPU×2) |
|
仮想マシン | クライアント | WindowsXP Professional x86 SP3 | - | 2仮想CPU |
Webサーバ | Windows Server 2003 Enterprise Edition SP2(64-bit) | - | 2仮想CPU | |
SQLサーバ | WindowsServer 2008 R2 Enterprise Edition | - | 2仮想CPU | |
ADサーバ | Windows Server 2008 R2 Enterprise Edition | - | 1仮想CPU |
WebサーバにおけるNonpagedPoolの使用量を測定した結果を以下に示します(図5参照)。
NonpagedPoolの使用量は最大35MB程度であり、NonpagedPoolの割り当て量が一番小さくなるStartupRAMを256MB に指定した場合でも、上限値まで十分な余裕があることがわかりました。
図4 WebサーバにおけるNonpagedPoolの使用量
今回の検証でNonpagedPoolは、Dynamic Memoryによるメモリ増加に伴って増えないものの、OSの動作に影響が及ぶ現象は見られませんでした。また別の観点で、大量のスレッドを自動作成するテストにおいてもNonpagedPoolが枯渇するような問題はありませんでした。
一方でマイクロソフトではVSS (Volume Shadow Copy Service)で大容量のボリュームをバックアップするような環境ではNonpagedPoolが大量に必要になるという情報を公開しています(※2)。こういった環境では動作するアプリケーションの特性を見極めて、十分な物理メモリを搭載することも大切です。
富士通ではNonpagedPoolの動作に関する検証の他に、今後も様々な動作や性能検証を予定しています。マイクロソフトへ検証結果をフィードバックしていくとともに、Windows Server 2008 R2 SP1の機能に関する設定指針の確立や利用ノウハウを蓄積していきます。
(2)VSS使用時のリソース消費について考えるべきポイントがマイクロソフトの技術情報にあります。
【ご注意】
動作確認したWindows Server 2008 R2 SP1は開発段階にあるため仕様変更の可能性があります。