esxtopバッチモード出力ファイル 加工スクリプト [vSphere 4.0] process a esxtop batch file in perl.



esxtopバッチモードで出力するcsvファイルは、素で取得すると(環境にも拠りますが)数万カラム以上となります。
それらをExcelでグラフ化したいとしても、カラム数の上限16,384列(Excel2007/2010の場合)に引っかかってOpenできない不都合があったりします。

代わりにWindowsのPerfmonitorを利用してグラフ表示する下記のサイトで紹介しているやり方もありますが、
任意のグラフで表現したいといった場合は、この大規模csvファイルを加工する必要が出てきます。

「esxtopバッチモードの出力をperfmonでグラフ表示する」(VMware Communities)
http://communities.vmware.com/blogs/kkomatsu/2009/01/17/esxtop-perfmon-

そこで、csvを加工するだけの簡単なperlスクリプトですが作ってみました。

機能としては二つです。
– バッチファイルが含むカラム一覧を出力する
– 任意のカラムを指定してデータ出力する

#!/usr/bin/perl
#-----------------------------------------------------------
#    名前:
#          esxtopバッチファイル整形スクリプト
#    機能:
#          esxtopバッチモード出力ファイル(CSV形式)より、
#          - バッチファイルが含むカラム一覧を出力する
#          - 任意のカラムを指定してデータ出力する
#    ESXバージョン:
#          vSphere 4.0
#    スクリプト動作確認環境:
#          Microsoft Windows XP Professional 5.1.2600 Service Pack 3
#          perl 5, version 12, subversion 4 (v5.12.4)
#    戻り値:
#          0 -> 正常終了
#          1 -> 異常終了
#    作成:
#          mani.tar(https://manitaninforest.wordpress.com)
#-----------------------------------------------------------
#
#    初期化
#
use strict;
use warnings;
use Getopt::Long;

our @cols = ();
our ($opt_h,$opt_c,$opt_l,$opt_f) = '';

#
#    オプション処理
#
GetOptions('help' => \$opt_h,
           'column=s' => \$opt_c,
           'list' => \$opt_l,
           'file=s' => \$opt_f
);

#    オプション排他制御
if ($opt_h) {
    &help;
} elsif ($opt_c && $opt_l){
    &help;
}

#    シグナルハンドル
$SIG{INT} = sub{
    exit 1;
};

#    columnオプション引数分解
my $I = 0;
if ($opt_c) {
    my @col1 = split(",", $opt_c);
    for (my $i = 0; $i <= $#col1; $i++) {
        if ($col1[$i] =~ /^(\d+)-(\d+)$/) {
            my $col_s = $1;
            my $col_e = $2;
            for (my $j = $col_s; $j <= $col_e; $j++) {
                $cols[$I] = $j;
                $I++;
            }
        } elsif ($col1[$i] =~ /^(\d+)$/) {
            $cols[$I] = $col1[$i];
            $I++;
        }
    }
}

#
#    メインルーチン
#
if ($opt_f){
    open IN , "<$opt_f" or die "File not found ($opt_f). exit 1.";
}else{
    &help;
}

#    カラム一覧出力
if ($opt_l && -r $opt_f or $opt_l && $opt_f eq '-'){
    my @line = split(/,/,<IN>);
    for(my $i=1 ; $i<=@line-2 ; $i++){
        printf "%6s: %s\n",$i, $line[$i];
    }
#    指定カラム値出力
}elsif ($opt_c && -r $opt_f or $opt_c && $opt_f eq '-'){
    while (<IN>){
        s/\(PDH-CSV 4\.0\) \(JST\)\(0\)/DATE/;
        my @line = split(",");
        for($I = 0; $I <= $#cols; $I++) {
            if ($I == 0) {
                print "$line[0], ";
            }
            print "$line[$cols[$I]], ";
        }
        print "\n";
    }
}else{
    &help;
}
close IN;
exit 0;

#
#    ヘルプ
#
sub help{
    print "使い方:\n\n";
    print $0. " [-h|--help] [-l|--list] [[-c|--column]=col_num[[,|=]col_num...]] [[-f|--file]=<esxtop filename>]\n\n";
    print "オプション:\n\n";
    print "-h or --help   : ヘルプを出力。\n";
    print "-l or --list   : カラム一覧を標準出力。\n";
    print "-c or --column : カラム番号を指定しデータを標準出力。\n";
    print "                 ※指定方法は個別指定(\"n1,n2\")と範囲指定(\"n1-n2\")可。\n";
    print "-f or --file   : esxtop出力ファイルを指定。\n";
    print "                 オプション引数にハイフン(\"-\")を指定すると標準入力待ちとなる。\n\n";
    print "例:\n\n";
    print "# ". $0. " -l -f esxtop.csv                カラム一覧を出力\n";
    print "# ". $0. " -c 1,2 -f esxtop.csv            カラム番号個別指定(1と2)でのデータ出力\n";
    print "# ". $0. " -c 1-10 -f esxtop.csv           カラム番号範囲指定(1から10)でのデータ出力(ファイル名指定)\n";
    print "# cat esxtop.csv | ". $0. " -c 1-10 -f -   カラム番号範囲指定(1から10)でのデータ出力(標準入力)\n";
    exit 1;
}

実行例について下記を参照ください。

perlスクリプトとesxtopバッチモード出力ファイルを用意

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2012/01/10     11:02  105918109 esxtopb.csv
-a---        2012/11/22     14:02       3421 esxtoproc.pl

引数無しで実行するとhelpを確認できます。

C:\>esxtoproc.pl
使い方:

C:\esxtoproc.pl [-h|--help] [-l|--list] [[-c|--column]=col_num[[,|=]col_num...]] [[-f|--file]=]

オプション:

-h or --help   : ヘルプを出力。
-l or --list   : カラム一覧を標準出力。
-c or --column : カラム番号を指定しデータを標準出力。
                 ※指定方法は個別指定("n1,n2")と範囲指定("n1-n2")可。
-f or --file   : esxtop出力ファイルを指定。
                 オプション引数にハイフン("-")を指定すると標準入力待ちとなる。

例:

# C:\esxtoproc.pl -l -f esxtop.csv                カラム一覧を出力
# C:\esxtoproc.pl -c 1,2 -f esxtop.csv            カラム番号個別指定(1と2)でのデータ出力
# C:\esxtoproc.pl -c 1-10 -f esxtop.csv           カラム番号範囲指定(1から10)でのデータ出力(ファイル名指定)
# cat esxtop.csv | C:\esxtoproc.pl -c 1-10 -f -   カラム番号範囲指定(1から10)でのデータ出力(標準入力)

C:\>

カラム一覧の確認はオプション”-l(エル)”

C:\>esxtoproc.pl -l -f esxtopb.csv | more
     1: "\\esx01\Memory\Memory Overcommit (1 Minute Avg)"
     2: "\\esx01\Memory\Memory Overcommit (5 Minute Avg)"
     3: "\\esx01\Memory\Memory Overcommit (15 Minute Avg)"
     4: "\\esx01\Physical Cpu Load\Cpu Load (1 Minute Avg)"
     5: "\\esx01\Physical Cpu Load\Cpu Load (5 Minute Avg)"
     6: "\\esx01\Physical Cpu Load\Cpu Load (15 Minute Avg)"
     7: "\\esx01\Physical Cpu(0)\% Processor Time"
     8: "\\esx01\Physical Cpu(1)\% Processor Time"
     9: "\\esx01\Physical Cpu(2)\% Processor Time"
    10: "\\esx01\Physical Cpu(3)\% Processor Time"
    :(中略)
 83655: "\\esx01\Interrupt Vector(0xff:CPU12)\Processing Time MicroSec/Interrupt"
 83656: "\\esx01\Interrupt Vector(0xff:CPU13)\Processing Time MicroSec/Interrupt"
 83657: "\\esx01\Interrupt Vector(0xff:CPU14)\Processing Time MicroSec/Interrupt"
 83658: "\\esx01\Interrupt Vector(0xff:CPU15)\Processing Time MicroSec/Interrupt"

C:\>

※サンプルファイルで8万カラム以上あります。

Memoryに該当するカラムを検索

C:\>esxtoproc.pl -l -f esxtopb.csv | findstr /C:"\\Memory\\"
     1: "\\esx01\Memory\Memory Overcommit (1 Minute Avg)"
     2: "\\esx01\Memory\Memory Overcommit (5 Minute Avg)"
     3: "\\esx01\Memory\Memory Overcommit (15 Minute Avg)"
    63: "\\esx01\Memory\Machine MBytes"
    64: "\\esx01\Memory\Console MBytes"
    65: "\\esx01\Memory\Kernel MBytes"
    66: "\\esx01\Memory\NonKernel MBytes"
    67: "\\esx01\Memory\Free MBytes"
    68: "\\esx01\Memory\Kernel Managed MBytes"
    69: "\\esx01\Memory\Kernel MinFree MBytes"
    70: "\\esx01\Memory\Kernel Reserved MBytes"
    71: "\\esx01\Memory\Kernel Unreserved MBytes"
    72: "\\esx01\Memory\Kernel State"
    82: "\\esx01\Memory\PShare Shared MBytes"
    83: "\\esx01\Memory\PShare Common MBytes"
    84: "\\esx01\Memory\PShare Savings MBytes"
    85: "\\esx01\Memory\Swap Used MBytes"
    86: "\\esx01\Memory\Swap Target MBytes"
    87: "\\esx01\Memory\Swap MBytes Read/sec"
    88: "\\esx01\Memory\Swap MBytes Write/sec"
    89: "\\esx01\Memory\Memctl Current MBytes"
    90: "\\esx01\Memory\Memctl Target MBytes"
    91: "\\esx01\Memory\Memctl Max MBytes"

C:\>

任意のカラム番号を指定して出力(下記例ではNo.63~No.67)

C:\>esxtoproc.pl -c 63-67 -f esxtopb.csv
"DATE", "\\esx01\Memory\Machine MBytes", "\\esx01\Memory\Console MBytes", "\\esx01\Memory\Kernel MBytes", "\\esx01\Memory\NonKernel MBytes", "\\esx01\Memory\Free MBytes",
"09/10/2011 18:00:22", "24566", "800", "673", "16647", "6445",
"09/10/2011 18:00:43", "24566", "800", "673", "16646", "6446",
"09/10/2011 18:01:03", "24566", "800", "673", "16645", "6447",
"09/10/2011 18:01:24", "24566", "800", "673", "16645", "6446",
"09/10/2011 18:01:44", "24566", "800", "673", "16644", "6447",
"09/10/2011 18:02:04", "24566", "800", "673", "16645", "6446",
"09/10/2011 18:02:25", "24566", "800", "673", "16645", "6447",
:(後略)

※サンプルの”esxtopb.csv”は18:00~19:00までの1時間分のデータを内包しているものを使用しています。

後はExcelにてグラフ化するなりピボットで集計するなりお好みで。

バッチモードの出力内容については下記を参考ください。
「Interpreting esxtop Statistics」(VMware Communities)
http://communities.vmware.com/docs/DOC-9279

amazonへジャンプ: VMware
amazonへジャンプ: perl

VMware Japan
http://www.vmware.com/jp/

広告
カテゴリー: IT, VMware タグ: , , , , , パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中