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
1 POD Error
The following errors were encountered while parsing the POD:
- Around line 536:
'=end' without a target?