|
NAMETest::Parser::iozone - Perl module to parse output from iozone.SYNOPSISuse Test::Parser::iozone; my $parser = new Test::Parser::iozone; $parser->parse($text); DESCRIPTIONThis module transforms iozone output into a hash that can be used to generate XML.FUNCTIONSAlso 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}}); } } } AUTHORBryce Harrington <bryce@osdl.org>COPYRIGHTCopyright (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 ALSOTest::ParserPOD ERRORSHey! The above document had some coding errors, which are explained below:
Visit the GSP FreeBSD Man Page Interface. |