Seichan です.こんばんわ.
今までとちょっと話題が変わって,ESXi で動作している仮想マシンの IO サイズ (IO Length) を調べる方法です.
なんで必要なの?
なんでこれが必要なのか.と言う所ですが,データストア側のパフォーマンスチューニングや vSphere Flash Read Cache (vFRC)を有効に利用する際の調査で使えます.
vFRC は設定の際にブロックサイズを指定するのですが,これのブロックサイズと仮想マシンから出てくる IO サイズが一致しないとキャッシュに載らないので,先に調査してからじゃないと色々とはまります.
また,データストアのパフォーマンスチューニングと言うところですが,こちらは RAID ストライプサイズや NFS データストア側のファイルシステムブロックサイズの決定に使えます.
どうやって調べるの?
vscsiStats というコマンドが用意されていますので,これを使って調査します.ESXi に SSH もしくはコンソールで接続,ログインしてください.コマンドを実行して仮想マシンを調査するにあたり「どの仮想マシン」の「どのディスクを対象」とするかを指定する必要があります.
調べたい仮想マシンの ID を特定する
vscsiStats -l コマンドで,現在その ESXi 上で動作している仮想マシンの名前と ID,接続されている仮想ディスクの SCSI ID と ID が列挙されます.
以下がその実行例になります.
~ # vscsiStats -l
Virtual Machine worldGroupID: 18552182, Virtual Machine Display Name: vm01.seichan.local, Virtual Machine Config File: /vmfs/volumes/4bc965a5-fa18ca02/vm01.seichan.local/vm01.seichan.local.vmx, {
Virtual SCSI Disk handleID: 8643 (scsi0:0)
Virtual SCSI Disk handleID: 8644 (scsi0:1)
}
Virtual Machine worldGroupID: 13679774, Virtual Machine Display Name: vm02.seichan.local, Virtual Machine Config File: /vmfs/volumes/4f9d71ed-171a0218-f2fb-001018314f49/vm02.seichan.local/vm02.seichan.local.vmx, {
Virtual SCSI Disk handleID: 8629 (scsi0:0)
}
この場合,次のように情報を読み取ります.
仮想マシンは「vm01.seichan.local」と「vm02.seichan.local」の2台が動作しています.「vm01.seichan.local」には仮想ディスクが2つ接続されており「vm02.seichan.local」は仮想ディスクが1つ接続されています.
「vm01.seichan.local」の仮想マシン ID は「18552182」で,仮想ディスクの ID は「8643」と「8644」です.
「vm02.seichan.local」の仮想マシン ID は「13679774」で,仮想ディスクの ID は「8629」です.
IO 情報を収集する
vscsiStats コマンドは,仮想マシン単位での情報取得を行うのか,仮想ディスクを指定した情報取得を行うのかの指定が可能です.
ディスクがたくさん接続されているような環境でない場合は,仮想マシン単位の指定が簡単だと思います.
仮想マシン単位での取得は次のように vscsiStats コマンドに -w [仮想マシンID] を指定して行います.-s オプションは取得開始のオプションです.この場合「vm01.seichan.local」の全体の IO 状況を取得します.
~ # vscsiStats -s -w 18552182
実行後,すぐにコマンドプロンプトに戻りますので,ある程度時間をおいた後に情報確認を行います.
ディスク単位での取得の場合は次のように vscsiStatus コマンドに -i [仮想ディスクID] を指定して行います.この場合「vm01.seichan.local」の「scsi0:0」ディスクの IO 状況のみを取得します.
~ # vscsiStats -s -w 8643
IO 情報の表示
取得した情報を表示するには,vscsiStatus -p オプションを使用します.-p オプションには複数の引数がありますが,IO サイズの確認の場合は ioLength を指定する事になります.他オプションは次の機会に…
表示にあたり,仮想マシンID もしくは 仮想ディスクID の指定も必要です.
以下の場合,仮想マシン「vm01.seichan.local」の情報を表示しています.
# vscsiStats -p ioLength -w 18552182
Histogram: IO lengths of commands for virtual machine worldGroupID : 18552182, virtual disk handleID : 8643 (scsi0:0) {
min : 512
max : 1048576
mean : 10833
count : 3312
{
224 (<= 512)
69 (<= 1024)
211 (<= 2048)
228 (<= 4095)
1823 (<= 4096)
124 (<= 8191)
290 (<= 8192)
90 (<= 16383)
30 (<= 16384)
64 (<= 32768)
80 (<= 49152)
5 (<= 65535)
1 (<= 65536)
0 (<= 81920)
60 (<= 131072)
1 (<= 262144)
1 (<= 524288)
}
}
Histogram: IO lengths of Read commands for virtual machine worldGroupID : 18552182, virtual disk handleID : 8643 (scsi0:0) {
min : 8192
max : 40960
mean : 8916
count : 113
{
0 (<= 512)
0 (<= 1024)
0 (<= 2048)
0 (<= 4095)
0 (<= 4096)
0 (<= 8191)
110 (<= 8192)
0 (<= 16383)
0 (<= 16384)
2 (<= 32768)
1 (<= 49152)
0 (<= 65535)
0 (<= 65536)
0 (<= 81920)
0 (<= 131072)
0 (<= 262144)
0 (<= 524288) 0 (> 524288)
}
}
Histogram: IO lengths of Write commands for virtual machine worldGroupID : 18552182, virtual disk handleID : 8643 (scsi0:0) {
min : 512
max : 1048576
mean : 10900
count : 3199
{
224 (<= 512)
69 (<= 1024)
211 (<= 2048)
228 (<= 4095)
1823 (<= 4096)
124 (<= 8191)
180 (<= 8192)
90 (<= 16383)
30 (<= 16384)
62 (<= 32768)
79 (<= 49152)
5 (<= 65535)
1 (<= 65536)
0 (<= 81920)
60 (<= 131072)
1 (<= 262144)
1 (<= 524288) 11 (> 524288)
}
}
一番最初に仮想マシン全体のサマリがあり,次に仮想ディスク1番目の読み取り時の IO に関する情報,その次に仮想ディスク1番目の書き込み時の IO に関する情報が出力されています.本来,この仮想マシンは仮想ディスク2番目の出力されていますが,長くなりますので端折っています.
仮想ディスク1番目の読み取り IO の箇所は次の通り,512 byte の所に集中してカウントアップされています.ですので,この仮想マシンに vFRC を設定するのであれば,8KB Block の設定が有用といえます.
110 (<= 8192)
仮想ディスク1番目の書き込み IO の箇所は次の通り,4096 byte もしくは 8192 byte が一番カウントが高いです.そのため,この仮想マシンが NFS データストア上にある場合は,NFS サーバ (NAS) 側のファイルシステムブロックサイズは 8K あたりが一番効率が良いと考えられます.
228 (<= 4095)
1823 (<= 4096)
124 (<= 8191)
180 (<= 8192)
実際は,こういった情報と合わせて NAS 側のファイルシステムの特性と合わせて最終的なサイズを決定することになりますが,やみくもに確認するよりも実際の状態を見てあたりを付けられますので,このコマンドを使って実際の状態を確認する事は時間の節約にもつながります.
実際,Seichan のところは NFS データストアを構成しており,ファイルシステムは ZFS を使っていますが,データストア用領域は次の通り 16K byte に設定しています.
pool0/VMware recordsize 16K local
と言う事で簡単ですが,vscsiStats コマンドを使って IO サイズを調べるでした.


コメント