GMO最新ネット業界レポート ソリューション編。『サービス開発者から見たWindows Server 2008 R2 Service Pack 1』とし、前回まではサービス提供者にとって非常に有用な機能であるDynamic Memoryについて概要とその効果を説明してきた。今回はWMIを使用しての「Reservation」の設定方法について、GMOインターネット株式会社 事業本部 樋口 勝一が執筆。
「Reservation」の設定方法
では、今回のキーとなる「Reservation」の設定方法についてご説明したいと思います。Hyper-Vマネージャでは設定できないのでWMIを使ってプログラムマチックに設定すると前述しました。(前回の記事はこちら)
いきなりですが、以下がそのコードです(VBScript)
: Option Explicit
2:
3: Dim objWMIService, objManagementService
4: Dim strVMName, intVirtualQuantity, intReservation, intLimit, intWeight, intTargetMemoryBuffer
5:
6: Set objWMIService = GetObject("winmgmts:\\.\root\virtualization")
7: Set objManagementService = objWMIService.ExecQuery("SELECT * FROM Msvm_VirtualSystemManagementService").ItemIndex(0)
8:
9: strVMName = "TestVM"
10: intVirtualQuantity = 16384
11: intReservation = 1024
12: intLimit = 16384
13: intWeight = 5000
14: intTargetMemoryBuffer = 20
15:
16: Dim objComputerSystem
17: Set objComputerSystem = objWMIService.ExecQuery("SELECT * FROM Msvm_ComputerSystem WHERE ElementName = '" & strVMName & "'").ItemIndex(0)
18: Dim objVirtualSystemSettingData
19: Set objVirtualSystemSettingData = objWMIService.ExecQuery("SELECT * FROM Msvm_VirtualSystemSettingData WHERE ElementName = '" & strVMName & "'").ItemIndex(0)
20: Dim objMemorySettingData
21: Set objMemorySettingData = objWMIService.ExecQuery("ASSOCIATORS OF {" & objVirtualSystemSettingData.Path_.Path & "} WHERE ResultClass = Msvm_MemorySettingData").ItemIndex(0)
22: objMemorySettingData.DynamicMemoryEnabled = True
23: objMemorySettingData.VirtualQuantity = intVirtualQuantity
24: objMemorySettingData.Reservation = intReservation
25: objMemorySettingData.Limit = intLimit
26: objMemorySettingData.TargetMemoryBuffer = intTargetMemoryBuffer
27: objMemorySettingData.Weight = intWeight
28:
29: Dim strMemorySettingData
30: strMemorySettingData = Array(1)
31: strMemorySettingData(0) = objMemorySettingData.GetText_(1)
32:
33: Dim objInParam, objOutParams
34: Set objInParam = objManagementService.Methods_("ModifyVirtualSystemResources").InParameters.SpawnInstance_()
35: objInParam.ResourceSettingData = strMemorySettingData
36: objInParam.ComputerSystem = objComputerSystem.Path_.Path
37: Set objOutParams = objManagementService.ExecMethod_("ModifyVirtualSystemResources", objInParam)
WMIを使用して「Reservation」の設定を行うにはこの程度の内容となります。大まかな流れとしては、WMIのインターフェースに接続して、Dynamic Memoryを有効にして、各値を設定するといった感じです。
では、細かく見てゆきましょう。
6行目 WMIのインスタンスを作成してvirtualizationプロバイダーに接続します。VBSからWMIを使用する場合はほぼ決まりきった構文となります。
Set objWMIService = GetObject("winmgmts:\\.\root\virtualization")
「.」はローカルのサーバーに接続する場合の記述となります。リモートのサーバーに接続する場合はサーバー名かIPアドレスを指定します。
「virtualization」はHyper-Vにアクセスするための名前空間名です。
VirtualQuantityスタートアップRAMReservation最低RAMLimit最大RAMTargetMemoryBufferメモリバッファー(5 ~2000%)Weightメモリの優先度(0 ~10000)http://msdn.microsoft.com/en-us/library/cc136856(v=vs.85).aspx
TargetMemoryBuffer(メモリバッファー)は仮想マシンの急激なメモリ使用などに備えるために、予め確保しておくメモリの割合です。2000%まで設定可能となっており、例えば1GBのスタートアップRAMで設定し、メモリバッファー2000%に設定すると最大RAMの値に関わらず20GBまでメモリが割り当てられることになります。既定値は20%となっているので、アプリケーションサーバーなど急なメモリの需要が考えられる仮想マシンには、仮想マシンが起動中であっても適宜調整することができます。
Weight(メモリの優先度)は例えばHyper-Vが割り当てることが出来るメモリが1GBとするとき、同じ1GBを使用する仮想マシンがあった場合、優先度の高い方にメモリが割り当てられることになります。
17行目 Dynamic Memoryを設定する仮想マシンに接続します。
19行目 該当仮想マシンの設定情報に接続します。
21行目 設定情報内のメモリ関連の設定情報に接続します。
WMIでのアプローチはまずは仮想マシンに接続し、その設定情報を取得、設定情報内のメモリ関連情報を取得というように段階を踏んでゆく必要があります。
22行目 Dynamic Memoryを有効にします。
objMemorySettingData.DynamicMemoryEnabled = True
Dynamic Memoryを使用することを明示しないと、これ以下の各設定を行っても静的メモリ使用となってしまうので必ず「DynamicMemoryEnabled = True」とする必要があります。
23行目~27行目 Dynamic Memoryの各値を設定しています。
29行目~31行目 各値を設定したメモリ関連の設定情報を仮想マシンの設定情報に書き込んでいます。
strMemorySettingData(0) = objMemorySettingData.GetText_(1)
各値を設定した後、設定情報として配列に格納します。
33行目~37行目 ModifyVirtualSystemResources メソッドを使用して各メモリ設定値を仮想マシンに反映させます。
以上のスクリプトで設定した場合このような画面となります。
以上で「Reservation」を含むDynamic Memoryの設定が完了しました。
WMIを使用することでDynamic Memoryだけでなく、仮想マシンの作成から各種設定、起動、停止などあらゆることが可能となります。大規模ホスティングにおいてはこういった一つ一つの設定をプログラマチックに処理することが必須となります。また、今回サンプルとして掲載したVBScript以外にも、VB.NET C# PowerShell など様々な言語でWMIを利用することがきます。
今回紹介したDynamic Memoryの設定以外にも、多くのサンプルを下記で紹介しています。 MVP WIN1の欄をご覧ください。
(http://technet.microsoft.com/ja-jp/scriptcenter/gg486878.aspx)
次回はサーバーで設定されたDynamic Memoryの設定で、仮想マシンでどのようなことが起こっているのかを確認してみたいと思います。
*本文中に記載されている会社名および商品名・サービス名は、各社の商標 または登録商標です。