plot-llstat

来自「lustre 1.6.5 source code」· 代码 · 共 183 行

TXT
183
字号
#!/usr/bin/perl -w# Report generation for llstat# ===============================#        The plot-llstat script is used to generate csv file and# instructions files for gnuplot from the output of llstat script.# Since llstat is generic in nature, plot-llstat is also generic# script.## Assume that:# operations = { open, close, read_bytes, write_bytes, connect, create, .. etc.}# parameters = { Rate, Total}##        plot-llstat script creates dat(csv) file using number of operations# specified by the user. Number of operations equals to number of columns in csv# file. And values in those columns are equals to the corresponding value of# the "$param_inx" parameter from the output file.#        The plot-llstat also creates .scr file that contains instructions# for gnuplot to plot the graph. After generating .dat and .scr files this# script invokes gnuplot to display graph.# Featrues:# 1. This script is generic in nature, works with any operations names.# 2. User have option to setect operations of their choice for graph generation.# 3. This script automatically selects different y axes according to the ranges#    of values of the parameter.# 4. One can change parameter to be consider for graphing #    by changing value of $param_inx.# Syntax:# $ plot-llstat <results_filename> [parameter index (default=2, i.e. Rate)]# [Note: 1. The output filt given to this script must have been generated # 	    with -g option to the llstat script.#	 2. This script may need modifications whenever there will be #           modifications in output format of llstat script.]# arg 0 is filename sub usages_msg(){	print "$0 parses and graphs the output of llstat using gnuplot,\n";	print "and generates .dat files for use in spreadsheets.\n";	print "Usage: $0 <results_filename> [parameter_index]\n";	print "         where parameter_index is one of:\n";	print "            1 - Count per interval\n";	print "            2 - Rate (count per second) (default)\n";	print "            3 - Total count\n";	print "ex: # llstat -i2 -g -c lustre-OST0000 > log\n";	print "    # $0 log 3\n";        exit 1;}my $count = 0; 		# count for number of rows in csv(.dat) file.my $jumpcolumn = -1;	# Columns to be skiped to get op. name and the "$param_inx" param. my @columns;		# Array for Operations names.my $columnvalues = "";  # Values of the "$param_inx" parameter for all operations.my @line;		# To store recently read line from log filemy $param_inx = 2;	# Index of the parameter are you interested in graphing.			# Default is 2 for Rate.my $GraphTitle;if ( !$ARGV[0] ) {	usages_msg(); 	}if ( $ARGV[1] ) {	$param_inx = $ARGV[1]; 	}$file = $ARGV[0];# Open log file for readingopen ( PFILE, "$file") or die "Can't open results log file";@alllines = <PFILE>;close PFILE;LABLE:while ( $count <= $#alllines ) {	$line = $alllines[$count];	#print "$line\n";	chop($line);	@line = split(/\s+/,$line); # splits line into tokens	# This comparison may be changed if there will be changes log file.	if( $line[0] eq "Timestamp" ) { 	# decide operations position in the logfile depends on num of 	# parameters(Rate, Total, etc.) present in this line.		$jumpcolumn = $#line;		$count = $count + 2; # skip the "---------" line from result file.		last LABLE;	}	if ($line[1] eq "STATS" && $line[2] eq "on") {                $GraphTitle = $line;                @GraphTitle = split( /:/, $GraphTitle );        }	$count++;}if ($jumpcolumn < 0) {	print "Invalid logfile format\n";	exit 1;}$lastline = $alllines[-1];@lastline = split(/\s+/,$lastline);my $allcolumns = "";$i = 1;while ($i < $#lastline) {	# display operations names for user selection.	print "$lastline[$i] ";	$allcolumns = "$allcolumns$lastline[$i] "; 	# capture the "$param_inx" parameter in $columnvalues, 	# used to define axes ranges depends on values.	$columnvalues = "$columnvalues$lastline[$i + $param_inx] ";	$i = $i + $jumpcolumn;}print "\nSelect columns(press return to select all): ";$columns = <STDIN>;# consider all operations if user hit return.if ( $columns eq "\n" ) {	$columns = $allcolumns;}chop ($columns);@columns = split (/\s+/, $columns);# Open .csv file for writting required columns from log file.open ( DATAFILE, "> $file.dat" ) or die "Can't open csv file for writting";print DATAFILE "0 ";for ($i = 0; $i < $#lastline; $i++) {	for ($j = 0; $j <= $#columns; $j++) {		if ($columns[$j] eq $lastline[$i]) {			print DATAFILE "$columns[$j]$lastline[$i + 4] ";		}			}}print DATAFILE "\n";my $found = 0;# depends on $jumpcolumn, capture operation names and value of # the "$param_inx" parameter for that perticular operation.while ( $count <= $#alllines )  {	$line = $alllines[$count];	#print "$line\n";	chop($line);	@line = split(/\s+/,$line); # splits line into tokens	# fill the csv(.dat) file with values of operations. 	print DATAFILE "$line[0]";	for ($j = 0; $j <= $#columns; $j++) {		for ($i = 1; $i < $#line ; $i++) {			if ($columns[$j] eq $line[$i]) {				# capture the "$param_inx" parameter 				print DATAFILE " $line[$i + $param_inx]";				$found = 1;			}		}		if (!$found) {			print DATAFILE " 0";		}		$found = 0;	}	print DATAFILE "\n";	$count = $count + 1;}close DATAFILE;# Open .csv file for reading columns titles.open ( DATAFILE, "$file.dat" ) or die "Can't open csv file for reading titles\n";my $titles = <DATAFILE>;close DATAFILE;chop($titles);@titles = split (/\s+/, $titles);# Open .scr file for writting instructions for gnuplot.open ( SCRFILE, "> $file.scr" ) or die "Can't open scr file for writting\n";print SCRFILE "set title \"$GraphTitle[1]\"\n";print SCRFILE "set xlabel \"time\"\n";if ($param_inx == 1) {    print SCRFILE "set ylabel \"units/interval\"\n";} elsif ($param_inx == 3) {    print SCRFILE "set ylabel \"units\"\n";} else {    print SCRFILE "set ylabel \"units/sec\"\n";}my $plot = "plot";# generate instructions for gnuplotfor ($i = 2; $i <= ($#columns + 2); $i++) {    print SCRFILE "$plot \"$file.dat\" using 1:$i axes x1y1 title \"$titles[$i - 1]\" with line\n";    $plot = "replot";}print SCRFILE "pause -1\n";close SCRFILE;# invoke gnuplot to display graph.system ("gnuplot $file.scr") == 0 or die "ERROR: while ploting graph.\nMake sure that gnuplot is working properly";

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?