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 オーバーコミット具合を見てみる話でした。