# check whether gnuplot exists?
system ("which gnuplot > /dev/null") == 0 or die "gnuplot does not exist, please install it and try again.\n";
+# check whether gnuplot supports png
+$pngsupport = "ldd `which gnuplot` | grep -q libpng";
+system ("$pngsupport") == 0 or die "gnuplot installed does not support png.
+ Please install gnuplot to support png and try again.\n";
+
my @GraphTitle;
#Subroutine to write .scr file that further used by gnuplot to plot the graph.
sub write_scr_file() {
my $op = $_[0];
+ my $rwlabel = $_[1];
print "generating plot $file-$rsz-$op.png\n";
open ( SCRFILE, "> $file-$rsz-$op.scr" ) or die "Can't open scr file for writing";
- if ($op eq "rd") {
- $rwlabel = "Read";
- }
- if ($op eq "wr") {
- $rwlabel = "Write";
- }
if ($opt_rdtitle || $opt_wrtitle) {
if ($op eq "rd") {
- print SCRFILE "set title \"@GraphTitle\\n$rwlabel, Rsize = $rsz KBytes, $opt_rdtitle\"\n";
+ print SCRFILE "set title \"@GraphTitle\\n$rwlabel, " .
+ "Rsize = $rsz, $lun LUNs, $opt_rdtitle\"\n";
}
if ($op eq "wr") {
- print SCRFILE "set title \"@GraphTitle\\n$rwlabel, Rsize = $rsz KBytes, $opt_wrtitle\"\n";
+ print SCRFILE "set title \"@GraphTitle\\n$rwlabel, " .
+ "Rsize = $rsz, $lun LUNs, $opt_wrtitle\"\n";
}
} else {
- print SCRFILE "set title \"@GraphTitle\\n$rwlabel, Rsize = $rsz KBytes\"\n";
+ print SCRFILE "set title \"@GraphTitle\\n$rwlabel, " .
+ "Rsize = $rsz, $lun LUNs\"\n";
}
- print SCRFILE "set xlabel \"Threads\"\n";
- print SCRFILE "set ylabel \"Speeds(MB/s)\"\n";
+ print SCRFILE "set xlabel \"Threads/LUN\"\n";
+ print SCRFILE "set ylabel \"Throughput (MiB/s)\"\n";
print SCRFILE "set logscale x\n";
print SCRFILE "set grid\n";
+ print SCRFILE "set key right bottom\n";
print SCRFILE "set terminal png\n";
print SCRFILE "set output \"/dev/null\"\n";
if ($opt_y != 0) {
$i = 2;
$xrange = 1;
# generate instructions for gnuplot, with adjusting X-axes ranges
- for ($j = 1; $j <= $thread ; $j = $j + $j) {
- if ($op eq "wr") {
- printf SCRFILE "$plot \"$file-$rsz-$op.dat\" using 1:$i axes x%dy1 title \"write-obj$j\" with line\n", $xrange;
- }
- if ($op eq "rd") {
- printf SCRFILE "$plot \"$file-$rsz-$op.dat\" using 1:$i axes x%dy1 title \"read-obj$j\" with line\n", $xrange;
- }
+ for ($j = $first_crg; $j <= $crg ; $j = $j + $j) {
+ $tmp=$j/$lun;
+ printf SCRFILE "$plot \"$file-$rsz-$op.dat\" " .
+ "using 1:$i:xticlabels(1) axes x%dy1 " .
+ "title \"$tmp crg/LUN\" " .
+ "with linespoints lw 2\n", $xrange;
$i++;
$plot = "replot";
}
system ("rm $file-$rsz-$op.scr");
}
+
#Subroutine to write .dat file that further used by gnuplot to plot the graph.
sub write_dat_file() {
my $op = $_[0];
print "writing data $file-$rsz-$op.dat\n";
# Open .csv/.dat file for writing required columns from log file.
- open ( DATAFILE, "> $file-$rsz-$op.dat" ) or die "Can't open csv file for writing";
- printf DATAFILE "%-6s", "0";
- for ($j = 1; $j <= $thread ; $j = $j + $j) {
- printf DATAFILE "%-8s", "$op$j";
- }
- for ( $i = 1; $i <= $region; $i = $i + $i ) {
- printf DATAFILE "\n%-6s", $i;
- for ($j = 1; $j <= $thread ; $j = $j + $j) {
- if (($op eq "rd" && $rdwr) || ($op eq "wr" && $wrrd) || ($readop) || ($writeop)) {
- if ( $out{$i}{$j} ) {
- printf DATAFILE "%-8s", $out{$i}{$j};
+ my $datafile = "$file-$rsz-$op.dat";
+ open ( DATAFILE, "> $datafile" ) or die "Can't open csv $datafile for writing";
+ printf DATAFILE "%-6s", "thrd";
+ for ($j = $first_crg; $j <= $crg ; $j = $j + $j) {
+ $tmp = $j/$lun;
+ printf DATAFILE "%-10s", "$tmp-crg";
+ }
+ for ( $i = $first_thread; $i <= $thread; $i = $i + $i ) {
+ printf DATAFILE "\n%-6s", $i/$lun;
+ for ($j = $first_crg; $j <= $crg ; $j = $j + $j) {
+ if ($op eq "rd") {
+ if ( $ard{$i}{$j} ) {
+ printf DATAFILE "%-10s", $ard{$i}{$j};
} else {
- printf DATAFILE "%-8s", "-";
+ printf DATAFILE "%-10s", "-";
}
- } else {
- if (($j <= 1 && $out{$i}{$j - 1})) {
- printf DATAFILE "%-8s", $out{$i}{$j - 1};
- }elsif ($out{$i}{$j + 1} && $j > 1) {
- printf DATAFILE "%-8s", $out{$i}{$j + 1};
+ } elsif ($op eq "wr" ) {
+ if ( $awr{$i}{$j} ) {
+ printf DATAFILE "%-10s", $awr{$i}{$j};
} else {
- printf DATAFILE "%-8s", "-";
+ printf DATAFILE "%-10s", "-";
}
}
}
close DATAFILE;
}
+#Subroutine to call .scr and .dat file write routines.
+sub write_files() {
+ for ($cnt = 0; $cnt < @operations; $cnt = $cnt + 1) {
+ if($operations[$cnt] eq "read") {
+ &write_dat_file("rd");
+ &write_scr_file("rd", "read");
+ } elsif ($operations[$cnt] eq "write") {
+ &write_dat_file("wr");
+ &write_scr_file("wr", "write");
+ }
+ }
+}
+
if ( !$ARGV[0] ) {
usage();
}
-$region = 0;
+$crg = 0;
$thread = 0;
+$first_crg = 1;
+$first_thread = 1;
$count = 0;
-$wrrd = 0;
-$rdwr = 0;
-$writeop = 0;
-$readop = 0;
$rsz = 0;
$opt_rdtitle = "";
$opt_wrtitle = "";
$opt_y = 0;
+$cnt = 0;
+@operations = ();
# Command line parameter parsing
use Getopt::Long;
GetOptions ('help' => \$opt_help, 'rt=s' => \$opt_rdtitle, 'wt=s' => \$opt_wrtitle, 'y=i' => \$opt_y) or usage();
open ( PFILE, "$file") or die "Can't open $file";
LABEL: while ( <PFILE> ) {
chomp;
+ # replace error strings to ensure same ordering of line fields
+ s/failed/failed . . . . ./g;
@line = split( /\s+/ );
- if ($line[27]) {
- print "invalid file format\n";
- exit 1;
- }
if ($count == 0) {
- @GraphTitle = @line;
+ @GraphTitle = @line[0 .. 6];
$count++;
next LABEL;
}
- if ($line[8]) {
- if ($line[8] eq "ENOMEM") {
- next LABEL;
- }
- }
- if (!$rsz && $line[3]) {
- $rsz = $line[3];
- }
- if ($rsz != $line[3]) {
- if($readop) {
- &write_dat_file("rd");
- &write_scr_file("rd");
- }
- if($writeop) {
- &write_dat_file("wr");
- &write_scr_file("wr");
- }
- if ($wrrd || $rdwr) {
- &write_dat_file("rd");
- &write_scr_file("rd");
- &write_dat_file("wr");
- &write_scr_file("wr");
- }
- $rsz = $line[3];
- $region = 0;
- $thread = 0;
+ # output format
+ # dev 1 sz 1048576K rsz 1024K crg 1 thr 8 write 604.55 [ 606.43, 606.43] read 754.02 [ 756.95, 756.95]
+ $linelen = @line;
+ if ($linelen < 11) {
+ print "invalid file format at line $count\n";
+ exit 1;
}
- #print "rg$line[5] th$line[7] w$line[9] r$line[$rindex]\n";
- $rindex = 18;
- if ($line[18]) {
- if ($line[10] eq "failed") {
- $rindex = 12;
- }
- if ($line[8] eq "write" && $line[17] eq "read") {
- $wrrd = 1;
- }
- if ($line[8] eq "read" && $line[17] eq "write") {
- $rdwr = 1;
- }
- } else {
- if ($line[8] eq "write" && $line[9]) {
- $writeop = 1;
- }
- if ($line[8] eq "read" && $line[9]) {
- $readop = 1;
+ if ($line[10]) {
+ if ($line[10] eq "ENOMEM") {
+ next LABEL;
}
-
}
- if ($wrrd || $rdwr) {
- $out{$line[7]}{$line[5]} = $line[9];
- if ($line[$rindex+1]) {
- if (!($line[$rindex+1] eq "failed")) {
- goto LABEL2;
- }
- } else {
-LABEL2: if ($line[5] <= 1 ) {
- $out{$line[7]}{$line[5] - 1} = $line[$rindex];
- } else {
- $out{$line[7]}{$line[5] + 1} = $line[$rindex];
+ if (!$rsz || $rsz ne $line[5]) {
+ &write_files() unless !$rsz;
+ $cnt = 0;
+ $lun = $line[1];
+ $rsz = $line[5];
+ $first_crg = $line[7];
+ $first_thread = $line[9];
+ for ($i = 10; $i <= $linelen; $i = $i + 5) {
+ if ($line[$i]) {
+ $operations[$cnt] = $line[$i];
+ $cnt++;
}
}
}
- if ($writeop) {
- $out{$line[7]}{$line[5]} = $line[9];
- }
- if ($readop) {
- $out{$line[7]}{$line[5]} = $line[9];
+ for ($i = 0; $i < @operations; $i++) {
+ if ($operations[$i] eq "read") {
+ $ard{$line[9]}{$line[7]} = $line[$i * 5 + 11];
+ } elsif ($operations[$i] eq "write") {
+ $awr{$line[9]}{$line[7]} = $line[$i * 5 + 11];
+ }
}
- if ( $region < $line[7] ) {
- $region = $line[7];
+ if ( $crg < $line[7] ) {
+ $crg = $line[7];
}
- if ( $thread < $line[5] ) {
- $thread = $line[5];
+ if ( $thread < $line[9] ) {
+ $thread = $line[9];
}
$count++;
}
close PFILE;
if ($count > 1 && $rsz) {
- if($readop) {
- &write_dat_file("rd");
- &write_scr_file("rd");
- }
- if($writeop) {
- &write_dat_file("wr");
- &write_scr_file("wr");
- }
- if ($wrrd || $rdwr) {
- &write_dat_file("rd");
- &write_scr_file("rd");
- &write_dat_file("wr");
- &write_scr_file("wr");
- }
+ &write_files()
} else {
print "Invalid log file format\n";
}