CPUアフィニティ設定を PowerCLI で確認する。(ESXi 5.x)

CPUアフィニティ設定を PowerCLI で確認する。(ESXi 5.x)

以前に VMの CPU アフィニティを PowerCLI で設定する方法をためしてみました。

今回は、その設定を確認する方法についてです。

CPU アフィニティは、
VM の vCPU を、特定の物理 CPU に紐づけする機能です。

物理 CPU といっても、ハイパースレッデイングを利用していると
論理 CPU として2倍数がみえますが、今回はひとまず気にしません。
(物理 CPU と vCPU だけで説明します。)

標準の PowerCLI コマンドレットでの確認


とりあえず PowerCLI でCPU アフィニティを確認するだけであれば下記のようなコマンドラインで OK です。
しかし、CPU アフィニティが特定の物理 CPU にかたよっていないか
といったことを確認するためには、ちょっとわかりにくいです。

PowerCLI> Get-VM vm?? | sort | Get-VMResourceConfiguration | select VM,CpuAffinity

VM              CpuAffinity
--              -----------
vm01             Cpu0, Cpu1
vm02             Cpu2, Cpu3
vm03                   Cpu4
vm04                   Cpu5
vm05                   Cpu6
vm06                   Cpu7
vm11 Cpu0, Cpu1, Cpu2, Cpu3
vm12 Cpu0, Cpu1, Cpu2, Cpu3
vm13 Cpu4, Cpu5, Cpu6, Cpu7
vm14 Cpu4, Cpu5, Cpu6, Cpu7

CPU アフィニティ設定をスクリプトで確認


そこで、
ちょっと CPU アフィニティが見やすいスクリプトを作成してみました。

スクリプト例: get_cpu_affinity.ps1

Connect-VIServer -Server <vCenterかESXiのアドレス>


$vms = $args[0]

# CPUアフィニティ ON/OFF の表示設定
$on  = "[on]"
$off = "[__]"

Get-VM $vms | sort -Property VMHost,Name | % {
    # CPUアフィニティ情報格納テーブルを作成
    $cpuset = "" | select hvname,vmname,cnt,

    cpu00,cpu01,cpu02,cpu03,cpu04,cpu05,cpu06,cpu07


    # ESXi名とVM名を取得
    $cpuset.hvname = $_.VMHost
    $cpuset.vmname = $_.Name
    $cpuset.cnt = $_.NumCpu
 
    # CPUアフィニティ情報を取得
    $vm = $_ | Get-View
    $vcpus = $vm.Config.CpuAffinity.AffinitySet
 
    $cpuset.cpu00 =  if ($vcpus -notcontains 0) {$off} else {$on}
    $cpuset.cpu01 =  if ($vcpus -notcontains 1) {$off} else {$on}
    $cpuset.cpu02 =  if ($vcpus -notcontains 2) {$off} else {$on}
    $cpuset.cpu03 =  if ($vcpus -notcontains 3) {$off} else {$on}
    $cpuset.cpu04 =  if ($vcpus -notcontains 4) {$off} else {$on}
    $cpuset.cpu05 =  if ($vcpus -notcontains 5) {$off} else {$on}
    $cpuset.cpu06 =  if ($vcpus -notcontains 6) {$off} else {$on}
    $cpuset.cpu07 =  if ($vcpus -notcontains 7) {$off} else {$on}
 
    # 結果を表示
    $cpuset
} | ft * -AutoSize


上記のスクリプトの実行例です。
引数には、VM 名を指定します。
たとえば「vm01」、「vm*」、「vm??」、「vm01,vm02」といった指定ができます。

PowerCLI> .\get_cpu_affinity.ps1 vm*

hvname     vmname cnt cpu00 cpu01 cpu02 cpu03 cpu04 cpu05 cpu06 cpu07
------     ------ --- ----- ----- ----- ----- ----- ----- ----- -----
sc-esxi501 vm01     2 [on]  [on]  [__]  [__]  [__]  [__]  [__]  [__]
sc-esxi501 vm02     2 [__]  [__]  [on]  [on]  [__]  [__]  [__]  [__]
sc-esxi501 vm03     1 [__]  [__]  [__]  [__]  [on]  [__]  [__]  [__]
sc-esxi501 vm04     1 [__]  [__]  [__]  [__]  [__]  [on]  [__]  [__]
sc-esxi501 vm05     1 [__]  [__]  [__]  [__]  [__]  [__]  [__]  [__]
sc-esxi501 vm06     1 [__]  [__]  [__]  [__]  [__]  [__]  [__]  [__]
sc-esxi502 vm11     2 [on]  [on]  [on]  [on]  [__]  [__]  [__]  [__]
sc-esxi502 vm12     2 [on]  [on]  [on]  [on]  [__]  [__]  [__]  [__]
sc-esxi502 vm13     4 [__]  [__]  [__]  [__]  [on]  [on]  [on]  [on]
sc-esxi502 vm14     4 [__]  [__]  [__]  [__]  [on]  [on]  [on]  [on]

hvname 列はESXi 名、vmname 列は VM 名を表示しています。
cnt 列 には VM の vCPU 数を表示しています。

CPU アフィニティ設定がない VM (=すべての物理 CPU を使用する VM。例では vm05 と vm06)は、
すべての物理 CPU が空欄になります。

おまけ

ちなみに、vm11 と vm12 のvCPU 数は2つですが、
4つの(vCPU 数より多い物理 CPU にアフィニティを設定してあります。

CPU アフィニティを設定する理由はだいたい下記2つだと思います。

  1. VM 同士を、物理的に隔離したい
  2. ソフトウェアライセンス費用を削減したい


1つ目の「VM同士の物理的な隔離」が目的(提供するサービスを分離するためなど)の場合、
VM の性能面を考慮すると 上記の vm11 や vm12 のように
vCPU 数より多数の物理 CPU に CPU アフィニティ設定したほうがよいのです。
これは、VM の vCPU とは別に、ESXi ハイパーバイザが VM 管理に物理 CPU を使用するためです。

2つ目の「VM に導入する製品ライセンス数(物理 CPU 数をカウントするような)節約」
のために CPU アフィニティを設定する場合は、vCPU と同数の物理 CPU に
アフィニティを設定することが多いはずです。


以上、PowerCLI で CPU アフィニティ設定を確認する方法でした。

Version history
Revision #:
1 of 1
Last update:
‎03-09-2013 08:47 AM
Updated by: