esxtop をバッチモード(-b)で実行してCSVファイルで保存しておくことが多いですが、
あとから、その時どんなVMが起動していたか確認したいことがあります。
テキストエディタで開いて確認したりするのは、結構大変なので
下記のように、コマンドラインで確認すると便利だと思います。
まず、esxtopには、Windowsのパフォーマンスカウンタ向けのヘッダがついています。
sedで、カンマ「,」を改行「\n」に置換して、カウンタを縦に並べてみました。
量が膨大なので、headで最初の数行だけ表示しています。
# head -1 esxtop_esx502.csv | sed 's/,/\n/g' | head
"(PDH-CSV 4.0) (UTC)(0)"
"\\esx502\Memory\Memory Overcommit (1 Minute Avg)"
"\\esx502\Memory\Memory Overcommit (5 Minute Avg)"
"\\esx502\Memory\Memory Overcommit (15 Minute Avg)"
"\\esx502\Physical Cpu Load\Cpu Load (1 Minute Avg)"
"\\esx502\Physical Cpu Load\Cpu Load (5 Minute Avg)"
"\\esx502\Physical Cpu Load\Cpu Load (15 Minute Avg)"
"\\esx502\Physical Cpu(0)\% Processor Time"
"\\esx502\Physical Cpu(1)\% Processor Time"
"\\esx502\Physical Cpu(2)\% Processor Time"
しかし、esxtopのカウンタは、量が多いです。
カウンタの数を表示(上記のコマンドラインの結果を wc -l で行数表示)してみると、数万件あります。
# head -1 esxtop_esx502.csv | sed 's/,/\n/g' | wc -l
30535→30535件もあります。
ただ、esxtopのデータには、VMごとに一意の名前のカウンタがあります。(例: VM名は「hdpjt1」)
# head -1 esxtop_esx502.csv | sed 's/,/\n/g' | grep hdpjt01 | head
"\\esx502\Group Cpu(6686629:hdpjt01)\Members"
"\\esx502\Group Cpu(6686629:hdpjt01)\% Used"
"\\esx502\Group Cpu(6686629:hdpjt01)\% Run"
"\\esx502\Group Cpu(6686629:hdpjt01)\% System"
"\\esx502\Group Cpu(6686629:hdpjt01)\% Wait"
"\\esx502\Group Cpu(6686629:hdpjt01)\% VmWait"
"\\esx502\Group Cpu(6686629:hdpjt01)\% Ready"
"\\esx502\Group Cpu(6686629:hdpjt01)\% Idle"
"\\esx502\Group Cpu(6686629:hdpjt01)\% Overlap"
"\\esx502\Group Cpu(6686629:hdpjt01)\% CoStop"
そこで、カウンタからVM名だけ拾ってみました。
下記のコマンドラインでは、
「\\esx502\Group Cpu(6686629:<仮想マシン名>)\% Used」 というようなカウンタ(文字列)を抽出して
awk で仮想マシン名の部分を抽出しています。
# head -1 esxtop_esx502.csv | sed 's/,/\n/g' | grep \:vmx\).*Used | awk -F: '{print $2}' | sort
dc1
vm01
vm02
vm03
vm04
ganglia1
hdpjt01
hdpnn01
hdptt01
hdptt02
hdptt03
infra1
veritas02
veritas03
sql1
sql2
vdca1
vc51u1
sv001
このコマンドラインは、ESXiでも、Linuxでも実行できるはずです。
簡単なスクリプトを用意して置くと便利です。
スクリプト例: esxtop2vm.sh
ESXTOP_CSV=$1
[ "x" == x$ESXTOP_CSV ] && { echo "./esxtop2vm.sh esxtop_csv_file"; exit; }
[ ! -f $ESXTOP_CSV ] && { echo "$ESXTOP_CSV file not exists."; exit; }
head -2 $ESXTOP_CSV | tail -1 | awk -F, '{print $1}'
head -1 $ESXTOP_CSV | sed 's/,/\n/g' | grep \:vmx\).*Used | awk -F: '{print $2}' | sort
下記のような感じで実行します。
esxtopを取得開始した時間
(ESXi は一般的に時間設定がUTCなので、日本時間マイナス9時間のことあり)と、
その時のVMが表示されます。
# sh esxtop2vm.sh esxtop_esx501.csv
"05/27/2013 18:49:05"
dc1
vm01
vm02
vm03
vm04
ganglia1
hdpjt01
hdpnn01
hdptt01
hdptt02
hdptt03
infra1
veritas02
veritas03
sql1
sql2
vdca1
vc51u1
sv001
以上、esxtopのCSVからVM名を抽出してみる話でした。