ESXi で稼働する VM に対して、ゲスト OS にインストールするライセンス制限の都合などで
CPU アフィニティ(VM の使用する CPU を固定する)をかけることがあります。

 

ためしに、PowerCLI で CPU アフィニティを設定してみました。

 

設定方法

 

今回、ESXi には8CPU(Cpu0~Cpu7)があり、
それを2つの VM(vm01, vm02)に4vCPUずつ割り当ててみます。

★vm01に、CPU0~3 をわりあて。
PowerCLI> Get-VM vm01 | Get-VMResourceConfiguration | Set-VMResourceConfiguration -CpuAffinityList 0,1,2,3

 

★vm01に、CPU4~7 をわりあて。
PowerCLI> Get-VM vm02 | Get-VMResourceConfiguration | Set-VMResourceConfiguration -CpuAffinityList 4,5,6,7

 

★CPUアフィニティ設定を確認します。それぞれのVMにCPUが割り当てられています。
PowerCLI> (get-vm * | get-View)| select Name,{$_.Config.CpuAffinity.AffinitySet}

Name                $_.Config.CpuAffinity.AffinitySet
----                ---------------------------------
vm01                {0, 1, 2, 3}
vm02                {4, 5, 6, 7}

 

CPU アフィニティは、

下記のようなオプションで割り当てることもできます。

※「-CpuAffinityList」ではなく、「-CpuAffinity」になります。

PowerCLI> Get-VM vm01 | Get-VMResourceConfiguration | Set-VMResourceConfiguration -CpuAffinity Cpu0,Cpu1,Cpu2,Cpu3
PowerCLI> Get-VM vm01 | Get-VMResourceConfiguration | Set-VMResourceConfiguration -CpuAffinity Cpu4,Cpu5,Cpu6,Cpu7

 

ちなみに、CPUアフィニティを解除するためには、
「Set-VMResourceConfiguration -CpuAffinity NoAffinity」とします。

PowerCLI> Get-VM vm01 | Get-VMResourceConfiguration | Set-VMResourceConfiguration -CpuAffinity NoAffinity

 

注意点

 

CPU アフィニティは VM 単位での設定です。
そのため、1つのVM に設定しても、ESXi 上のそれ以外の VM はデフォルトですべての CPU を使用します。

 

試しに、ESXi にログインして、esxtop で確認してみました。

esxtop 起動 → 「大文字 V (VMだけ表示)」→「f と i を押す(表示フィールド選択)」

とすると、CPU アフィニティの割り当て状況(AFFINITY_BIT_MASK) の列が確認できるようになります。

 

CPU アフィニティをかけていない状態ではすべての CPU が使用されます。(0~7)
affinity1.png

vm01 にだけCPUアフィニティ(CPU 0~3)をかけた状態です。

vm02 は、まだすべての CPU(0~7)を使用しています。

affinity2.png

vm01 と vm02 それぞれにアフィニティをかけた状態です。

VM が、別の CPU を使用している様子が見えます。

affinity3.png

 

ちなみに、CPU アフィニティをかけると

その分ハイパーバイザの自由な CPU スケジューリング(vCPU への CPU 割り当て)を邪魔してしまうらしいです。

管理面や性能面(ゲストのライセンス制限以外の面)では、

CPU アフィニティをかけない方がよいケースが多そうです。

 

CPU アフィニティ設定確認については、こちらも参考にしてください。

 

以上、PowerCLI で VM に CPU アフィニティをかけてみる話でした。