自宅や検証環境の ESXi では、結構こんなケースがあるのではないかと思います。
- そこそこ大容量のローカルHDD をいくつも接続している。
- 何となく負荷分散して あまり特定のデータストアに偏らないように VM を配置する。
- しかし VM が多くなってきていて、新しい VM を作成するときにどのデータストアに配置するか悩む。
- しかも vCenter管理していない。(無償版 ESXi とか)
最近、自宅 ESXi で新しい VM をどのHDD(データストア)に配置しようか迷うので
データストアの空き状態と使用状況を PowerCLI で確認する方法を考えてみました。
データストア空き容量の確認
普通に Get-Datastore で情報取得するとこんな感じに見られます。
※すでに Connect-VIServer で ESXi に直接接続しています。
※約1TBのデータストアが3つあります。
PowerCLI> Get-Datastore | select Name,Type,FreeSpaceGB,CapacityGB | sort Name| ft -AutoSize
Name Type FreeSpaceGB CapacityGB
---- ---- ----------- ----------
ds_local_01 VMFS 505.8291015625 931.25
ds_local_02 VMFS 473.7060546875 931.25
ds_local_03 VMFS 534.546875 931.25
すこし表示結果を見やすくしてみました。
データストアは、どれもけっこう空きがあります。
PowerCLI> Get-Datastore | select Name,Type,@{N="空き容量GB";E={[int]$_.FreeSpaceGB}},@{N="全体容量GB";E={[int]$_.CapacityGB}} | sort Name | ft -AutoSize
Name Type 空き容量GB 全体容量GB
---- ---- ---------- ----------
ds_local_01 VMFS 506 931
ds_local_02 VMFS 474 931
ds_local_03 VMFS 535 931
データストアの使用状況(IOPS)の確認
Get-Stat コマンドレットでデータストアの読み取り数、書き込み数の情報を取得してみました。
スクリプトでは、下記のメトリック(カウンタ)を情報取得して、
PowerShell の measure(Measure-Object)で集計しています。
- datastore.numberwriteaveraged.average
→データストアの Number Write Averaged (秒あたりの平均書き込み数) - datastore.numberreadaveraged.average
→データストアの Number Read Averaged (秒あたりの平均読み取り数)
※この2つのメトリックでは、20秒単位で過去180回分(=1時間分)の情報が取得できます。
スクリプトファイル: get_datastore_stat.ps1
$stat_counter = "datastore.numberwriteaveraged.average","datastore.numberreadaveraged.average"
# 統計情報を取得
$stat = Get-VMHost | Get-Stat -Stat $stat_counter | sort Timestamp$stat | group MetricId,Instance,Unit | % {
$stat_name = $_.Name
$stat_gr = $_.Group
# データストア名を取得
$ds_id = "Datastore-" + ($stat_gr | select Instance -Unique).Instance
$ds_name = Get-Datastore -Id $ds_id
# 統計名を取得
$metric_name = ($stat_gr | select MetricId -Unique).MetricId
# 取得した統計情報の期間を取得(1時間)
$stat_time_sort = $stat_gr | sort Timestamp
$begin_time = $stat_time_sort | select Timestamp -First 1
$begin_time = $begin_time.Timestamp.toString("HH:mm:ss")
$end_time = $stat_time_sort | select Timestamp -Last 1
$end_time = $end_time.Timestamp.toString("HH:mm:ss")
$stat_gr | measure -Property Value -Average -Sum -Maximum -Minimum |
select `
@{N="Datastore";E={$ds_name}},
@{N="Metric";E={$metric_name}},
Count,
@{N="Average";E={"{0:0.00}" -F [math]::Round($_.Average,2)}},
Sum,
Maximum,
Minimum,
@{N="Begin";E={$begin_time}},
@{N="End";E={$end_time}}
}
実行するとこんな感じで表示されます。
※下の例だと、いままで適当に配置していたので結構データストアで差が出ています・・・
PowerCLI> .\get_datastore_stat.ps1 | sort Datastore,Metric | ft -AutoSize
Datastore Metric Count Average Sum Maximum Minimum Begin End
--------- ------ ----- ------- --- ------- ------- ----- ---
ds_local_01 datastore.numberreadaveraged.average 180 0.00 0 0 0 21:34:20 22:34:00
ds_local_01 datastore.numberwriteaveraged.average 180 2.49 448 9 1 21:34:20 22:34:00
ds_local_02 datastore.numberreadaveraged.average 180 0.02 3 3 0 21:34:20 22:34:00
ds_local_02 datastore.numberwriteaveraged.average 180 29.37 5287 67 12 21:34:20 22:34:00
ds_local_03 datastore.numberreadaveraged.average 180 0.00 0 0 0 21:34:20 22:34:00
ds_local_03 datastore.numberwriteaveraged.average 180 38.52 6934 79 17 21:34:20 22:34:00
これからは、「ds_local_01 というデータストアのディスク IO が少なそうなので、
次はここに VM を追加作成しよう」 といった感じで VM のデータストアを決めようと思います。
無償版 ESXi の場合は PowerCLI では設定変更系の処理をすることができませんが
設定確認や状態確認で使用するだけでも PowerCLI はけっこう便利だと思います。
vSphere Client のサマリ画面やパフォーマンスチャートなどからも同じ情報が見られますが・・・
以上、ESXi の VM 配置を考える話でした。