Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
Test::Parser::iozone(3User Contributed Perl DocumentatiTest::Parser::iozone(3)

NAME
       Test::Parser::iozone - Perl module to parse output from iozone.

SYNOPSIS
	use Test::Parser::iozone;

	my $parser = new Test::Parser::iozone;
	$parser->parse($text);

DESCRIPTION
       This module transforms iozone output into a hash	that can be used to
       generate	XML.

FUNCTIONS
       Also see	Test::Parser for functions available from the base class.

   new()
       Creates a new Test::Parser::iozone instance.  Also calls	the
       Test::Parser base class'	new() routine.	Takes no arguments.

       data()

       Returns a hash representation of	the iozone data.

       Override	of Test::Parser's default parse_line() routine to make it able
       to parse	iozone output.

       plot_2d()

       Plot the	data using Gnuplot.

       commented_out

       FIXME: This will	eventually be supported	through	the Test::Presenter
       method
	to_plot().  When this method has been written, most of this can	be
       thrown out

       sub plot_2d {
	   my $self = shift;

	   my %gopts;
	   $gopts{'defaults'} =	{
	       'title' => 'iozone Performance',
       #	'yrange' => '[0:]',
	       'x-axis label' => 'Record size (kb)',
	       'y-axis label' => 'File size (kb)',
       #	'extra_opts' =>	'set grid xtics	ytics',
       #	'output	type' => "$self->{format}",
	       'output file' =>	"$self->{outdir}/iozone-",
	   };

	   my %data_opts = ( 'title' =>	'',
			     'style' =>	'lines',
			     'type'  =>	'columns' ,
			     );

	   # TODO:  We're just taking a	snapshot at 32 byte record lengths
	   #	    We should either take this as an input, or provide a
	   #	    3D plotting	capability
	   my $reclen =	32;
	   my @x_columns;
	   my %y_columns;
	   foreach my $d (@{$self->{data}}) {
	       next unless ($d->{'reclen'} == $reclen);
	       push @x_columns,	$d->{'KB'};
	       foreach my $key (keys %{$d}) {
		   next	unless (defined	$d->{$key});
		   push	@{$y_columns{$key}}, $d->{$key};
	       }
	   }

	   print "Number of X points (should be	about 10-20):",
	   scalar @x_columns, "\n";

	   #
	   # Generate charts.
	   #
	   foreach my $h (IOZONE_HEADERS) {
	       # Skip x-columns
	       next if ($h =~ /^kb$/i
			or $h =~ /^reclen$/i);

	       %{$gopts{$h}} = %{$gopts{'defaults'}};
	       $gopts{$h}->{'title'} .=	" - $h";
	       $gopts{$h}->{'output file'} .=  "$h.$self->{format}";

	       if (defined $y_columns{$h} ) {
		   print "plotting $h\n";
		   gnuplot( $gopts{$h},	[\%data_opts, \@x_columns, $y_columns{$h}] );
	       }
	   }
       }

       commented_out

       FIXME: This will	eventually be supported	through	the Test::Presenter
       method
	to_plot().  When this method has been written, most of this can	be
       thrown out

       # This is a static function for plotting	multiple runs #	with a date or
       software	version	as the X-Axis sub historical_plot {
	   my $runs = shift || return undef;
	   my $file_sizes = shift || return undef;
	   my $reclens = shift || return undef;

	   my $format =	$runs->[0]->{format};
	   my $outdir =	$runs->[0]->{outdir};

	   # Graph options
	   my %gopts_defaults =
	       (
		'title'	=> 'Historical iozone Performance',
		'x-axis	label' => 'Time',
		'y-axis	label' => 'KB/sec',
		'yrange'       => '[0:]',
		'xdata'	       => 'time',
		'timefmt'      => '%b:%d:%H:%M:%S:%Y',
		'format'       => ['y',	'%.0f'],

		'output	file'  => "$outdir/iozone-",
       #	 'extra_opts'	=> 'set	grid',
		);

	   # Data-set default options
	   my %data_opts =
	       (
		 'title' => '',
		 'style' => 'lines',
		 'type'	 => 'matrix',
		  );

	   if (@{$runs}	< 1) {
	       warn "No	data to	graph\n";
	       return undef;
	   }

	   if (@{$file_sizes} == 1) {
	       # Put file_size into title
	       $gopts_defaults{'title'}	=
		   join(" - ", $gopts_defaults{'title'}, "$file_sizes->[0] kb files");
	   }

	   if (@{$reclens} == 1) {
	       # Put reclen into title
	       $gopts_defaults{'title'}	=
		   join(" - ", $gopts_defaults{'title'}, "$reclens->[0]	kb records");
	   }

	   # Transform the list	of runs	into data matrices indexed by column name
	   my %data = _runs_to_data($runs, $file_sizes,	$reclens);
	   if (values %data < 1) {
	       warn "Error:  Could not transform data\n";
	       return undef;
	   }

	   # Create a plot for each of the iozone fields with data defined
	   foreach my $h (IOZONE_HEADERS) {
	       # Skip x-columns
	       next if ($h =~ /^kb$/i
			or $h =~ /^reclen$/i);

	       my %gopts = %gopts_defaults;
	       $gopts{'output file'} .=	 "$h.$format";

	       if ( $data{$h} )	{
		   my @data_sets;
		   foreach my $file_size (@{$file_sizes}) {
		       foreach my $reclen (@{$reclens})	{
			   my %opts = %data_opts;
			   if (@{$file_sizes} >	1) {
			       $opts{'title'} .= " - $file_size	kb files";
			   }
			   if (@{$reclens} > 1)	{
			       $opts{'title'} .= " - $reclen kb	records";
			   }
			   push	@data_sets, [\%opts, $data{$h}->{$file_size}->{$reclen}];
		       }
		   }
		   print "plotting $h\n";
		   gnuplot(\%gopts, @data_sets );
	       }
	   }

       }

       # This is a static function to compare several runs sub comparison_plot
       {
	   my $runs = shift || return undef;
	   my $names = shift ||	return undef;

	   my $num_runs	= @{$runs};
	   my $num_names = @{$names};

	   if ($num_runs != $num_names)	{
	       warn "$num_runs runs and	$num_names provided.\n";
	       warn "Error:  Must specify a name for each run\n";
	       return undef;
	   }

	   if ($num_runs < 2) {
	       warn "Error:  Need at least 2 runs to do	comparison plot\n";
	       return undef;
	   }

	   my $format =	$runs->[0]->{format};
	   my $outdir =	$runs->[0]->{outdir};

	   # Graph options
	   my %gopts =
	       (
		'title'	       => 'iozone Performance Comparison',
		'x-axis	label' => 'Record size (kb)',
		'y-axis	label' => 'File	size (kb)',
		'output	file'  => "$outdir/iozone-",
		);

	   # Transform the list	of runs	into data matrixes indexed by column name
	   my %data;
	   my $reclen =	32;
	   foreach my $run (@{$runs}) {
	       my $name	= shift	@{$names};
	       my %data_opts = (
			     'title' =>	$name,
			     'style' =>	'lines',
			     'type'  =>	'columns',
			     );

	       # Extract the data out of hashes	and put	into columns
	       my @x_column;
	       my %y_columns;
	       foreach my $d ($run->{data}) {
		   next	unless ($d->{'reclen'} == $reclen);
		   push	@x_column, $d->{'KB'};

		   foreach my $key (keys %{$d})	{
		       push @{$y_columns{$key}}, $d->{$key};
		   }
	       }

	       # Put the columns
	       foreach my $key (keys %y_columns) {
		   push	@{$data{$key}},	[\%data_opts, \@x_column, $y_columns{$key}];
	       }
	   }

	   # Create a plot for each of the iozone fields with data defined
	   foreach my $h (IOZONE_HEADERS) {
	       # Set the global	options
	       %{$gopts{$h}} = %{$gopts{'defaults'}};
	       $gopts{$h}->{'title'} .=	" - $h";
	       $gopts{$h}->{'output file'} .=  "$h.$format";

	       if (defined $gopts{$h} && defined $data{$h}) {
		   print "plotting $h\n";
		   gnuplot($gopts{$h}, @{$data{$h}});
	       }
	   }

       }

AUTHOR
       Bryce Harrington	<bryce@osdl.org>

COPYRIGHT
       Copyright (C) 2006 Bryce	Harrington & Open Source Development Labs,
       Inc.  All Rights	Reserved.

       This script is free software; you can redistribute it and/or modify it
       under the same terms as Perl itself.

SEE ALSO
       Test::Parser

POD ERRORS
       Hey! The	above document had some	coding errors, which are explained
       below:

       Around line 536:
	   '=end' without a target?

perl v5.32.1			  2008-02-27	       Test::Parser::iozone(3)

NAME | SYNOPSIS | DESCRIPTION | FUNCTIONS | AUTHOR | COPYRIGHT | SEE ALSO | POD ERRORS

Want to link to this manual page? Use this URL:
<https://www.freebsd.org/cgi/man.cgi?query=Test::Parser::iozone&sektion=3&manpath=FreeBSD+13.0-RELEASE+and+Ports>

home | help