個人的備忘録。

インフラSEの備忘録です。インフラ構築、ニュース、ネタをたらたらと書いていきます。。。

Hyper-Vで仮想マシンが使用できるメモリサイズの確認

 Hyper-Vホスト上でタスクマネージャーからメモリ使用量を確認して、まだメモリに空きがあると思っても、何故か仮想マシンが起動できないときがある。ホスト用のメモリが必要だったり、仮想マシンのオーバーヘッドによるもののせいであるとのこと。
 また、タスクマネージャー上からみて空きがあって、仮想マシンを無事起動できたとしても、ホストのメモリが不足して、いきなり仮想マシンが落ちることもある。
 Hyper-Vをサイジングするにあたっては、余裕をもって設計する必要があります。メモリサイズをギリギリにしてしまうと不安定になること請け合い。あと、既にあるHyper-V上にあとどれだけ仮想マシン向けにメモリを利用できるかを考える必要がある。

で、実際に仮想マシンに使えるメモリをざっくり算出する計算式は下記。

[タスクマネージャーの"利用可能"メモリ] – [仮想マシンすべてのメモリ予約サイズ]

これはだいたいの目安。

 

Microsoftの公式見解ではこうなっている。

[Windows Server 2008 の場合]
384MB + 30MB per 1GB of physical memory on the host machine.
なので、例えばホストに積んでるメモリが32GBの場合、
384MB + (30MB * 32) = 約1.3GB
となる。なので、
32GB - 約1.3GB = 約30GB
仮想マシンに利用できるメモリサイズとなるようです。
Hyper-V Dynamic Memory and Host Memory Reserve setting – PFE Virtualization Blog

[Windows Server 2012の場合]
MSから具体的な計算式まで公開されていない。ただし、パフォーマンスカウンタのHyper-V Dynamic Memory Balancer\Available Memoryの値が、仮想マシンに利用できるメモリサイズとなるので、ホストに積んでるメモリが32GBの場合、
32GB - [Available Memory]
仮想マシンに利用できるメモリサイズになる。
Virtual machine that's running on Windows Server 2012 R2 doesn't start

Windows Server 2012の場合、ホストで使うメモリが分かりにくいので、HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\VirtualizationキーのMemoryReserve(DWORD)に予約サイズをMB単位で指定する、といったこともできる。当然、非推奨となっているため、もしどうしてもしたい場合は自己責任でしましょう。

 

PowerShellで計算できるみたいなので、備忘録。

(参考サイト)仮想マシンが使用できるメモリーサイズ

# 割り当て可能メモリーサイズを実際に聞いてみる
$Counter = Get-counter -Counter "\hyper-v dynamic memory balancer(system balancer)\available memory"

$VMMem = $Counter.CounterSamples.CookedValue
"Hyper-V available memory = {0} GB" -f ($VMMem * 1MB / 1GB)

# 割り当て済みメモリーサイズと合算して、トータル割り当て可能メモリーサイズを算出する
$MemoryAssigned = 0
Get-VM | % { $MemoryAssigned += $_.MemoryAssigned}
"Total memory size can be assigned to the VM = {0} GB" -f *1

 

Hyper-Vにバックアップソフトを入れているとか、常駐のソフトを何か入れている場合は予期せぬメモリ消化で、仮想マシンが不安定になるので、上記はあくまで目安。やっぱり多めにメモリを積んで、多めにバッファを取ることをお勧めします。

*1:$VMMem * 1MB / 1GB) + ($MemoryAssigned / 1GB