ESXiで起動中のVMがどれくらいCPUオーバーコミットか「見える化」してみようと思い
簡単なPowerCLI スクリプトを作成してみました。
get_esxi_cpuoc.ps1
Get-VMHost | % {
$hv = $_
$hv_pcpu = $hv.NumCpu
$hv_vcpus = 0
$hv | Get-VM | where {$_.PowerState -eq "PoweredOn"} | % {
$vm = $_
$hv_vcpus += $vm.NumCpu
}
"$hv では、 $hv_pcpu 物理コアに $hv_vcpus vCPUあります。"
"CPU物理コアのオーバーコミット: " + ($hv_vcpus / $hv_pcpu * 100) + "%"
"vCPU: " + ("■" * $hv_vcpus)
"pCPU: " + ("□" * $hv_pcpu)
} | ft -AutoSize
PowerCLI で接続中のvCenter/ESXi から、すべてのESXiについて情報取得します。
起動中VM(PowerState = PoweredOn のもの)に設定されている、
すべてのvCPU数を足して、物理CPUコア数と並べて表示しています。
実行例
2台のESXiに接続して実行してみたイメージです。
ESXi(例だと、esxi243 と esxi244)は、それぞれHWスペックが異なります。
vCPUと、pCPU(物理CPUコア)のゲージ的なものが並べて表示されます。
一コマ、1CPU(vCPU/pCPU)です。
基本的には、vCPUごとにpCPUがずっと固定されているわけではありません。
特にCPUアフィニティを設定していない場合は、
上段に表示された vCPU が、空いている下段の pCPUのどれかに割り当てられる感じです。
PowerCLI> Connect-VIServer esxi243,esxi244
PowerCLI> .\get_esxi_cpuoc.ps1
esxi244 では、 4 物理コアに 40 vCPUあります。
CPU物理コアのオーバーコミット: 1000%
vCPU: ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
pCPU: □□□□
esxi243 では、 2 物理コアに 12 vCPUあります。
CPU物理コアのオーバーコミット: 600%
vCPU: ■■■■■■■■■■■■
pCPU: □□
※接続するときの画面表示は省略しています。
ちなみに、ESXi上のVM全体で物理CPUコア数よりも多くvCPU割り当てした状態でも、
すぐにCPUリソースに余裕がなくなるというわけではありません。
上記の例でもオーバーコミットは1000%と600%ですが、
実際のCPUリソースにはまだ余裕があります。CpuTotalMhz のうち、CpuUsageMhz の分しか使用していません。
PowerCLI> Get-VMHost | select Name,NumCpu,CpuUsageMhz,CpuTotalMhz | ft -AutoSize
Name NumCpu CpuUsageMhz CpuTotalMhz
---- ------ ----------- -----------
esxi244 4 10902 13568
esxi243 2 1087 2594
以上です。
CPUオーバーコミット具合を見てみる話でした。