X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Futils%2Fllobdstat;h=9c9cf5a1bc53ddabde972918be76520a82ee2bc3;hp=300c9d882bbc56ab548eb9124fcd6a19325b9d16;hb=38879686cc9112632ce6173473a16f14ff7e7330;hpb=4e155d1c5fbec5a849f2f774322449c08d1e3c5d diff --git a/lustre/utils/llobdstat b/lustre/utils/llobdstat index 300c9d8..9c9cf5a 100644 --- a/lustre/utils/llobdstat +++ b/lustre/utils/llobdstat @@ -1,5 +1,5 @@ #!/usr/bin/perl -# llobdstat is a utility that parses obdfilter statistics files +# llobdstat is a utility that parses obdfilter statistics files # found at proc/fs/lustre//stats. # It is mainly useful to watch the statistics change over time. @@ -10,7 +10,7 @@ my $obdstats = "stats"; sub usage() { - print STDERR "Usage: $pname []\n"; + print STDERR "Usage: $pname [ [}]\n"; print STDERR "where ost_name : ost name under $defaultpath/obdfilter\n"; print STDERR " interval : sample interaval in seconds\n"; print STDERR "example: $pname lustre-OST0000 2\n"; @@ -20,30 +20,34 @@ sub usage() my $statspath = "None"; my $interval = 0; +my $counter = undef; -if (($#ARGV < 0) || ($#ARGV > 1)) { +if (($#ARGV < 0) || ($#ARGV > 2)) { usage(); } else { if ( $ARGV[0] =~ /help$/ ) { - usage(); + usage(); } if ( -f $ARGV[0] ) { - $statspath = $ARGV[0]; + $statspath = $ARGV[0]; } elsif ( -f "$ARGV[0]/$obdstats" ) { - $statspath = "$ARGV[0]/$obdstats"; + $statspath = "$ARGV[0]/$obdstats"; } else { - my $st = `ls $defaultpath/*/$ARGV[0]/$obdstats 2> /dev/null`; - chop $st; - if ( -f "$st" ) { - $statspath = $st; - } + my $st = `ls $defaultpath/obdfilter/$ARGV[0]/$obdstats 2> /dev/null`; + chop $st; + if ( -f "$st" ) { + $statspath = $st; + } } if ( $statspath =~ /^None$/ ) { die "Cannot locate stat file for: $ARGV[0]\n"; } - if ($#ARGV == 1) { - $interval = $ARGV[1]; - } + if ($#ARGV > 0) { + $interval = $ARGV[1]; + } + if ($#ARGV > 1) { + $counter = $ARGV[2]; + } } print "$pname on $statspath\n"; @@ -52,10 +56,12 @@ my %cur; my %last; my $mhz = 0; -#Removed some statstics like open, close that obdfilter don't contains. -#To add statistics parameters one need to specify parameter names in below declarations in same sequence. -my ($read_bytes, $write_bytes, $create, $destroy, $statfs, $punch, $snapshot_time) = - ("read_bytes", "write_bytes", "create", "destroy", "statfs", "punch", "snapshot_time"); +# Removed some statstics like open, close that obdfilter doesn't contain. +# To add statistics parameters one needs to specify parameter names in the +# below declarations in the same sequence. +my ($read_bytes, $write_bytes, $create, $destroy, $statfs, $punch, + $snapshot_time) = ("read_bytes", "write_bytes", "create", "destroy", + "statfs", "punch", "snapshot_time"); my @extinfo = ($create, $destroy, $statfs, $punch); my %shortname = ($create => "cx", $destroy => "dx", $statfs => "st", $punch => "pu"); @@ -65,106 +71,113 @@ sub get_cpumhz() my $cpu_freq; my $itc_freq; # On Itanium systems use this if (open(CPUINFO, "/proc/cpuinfo")==0) { - return; + return; } while () { - if (/^cpu MHz\s+:\s*([\d\.]+)/) { $cpu_freq=$1; } - elsif (/^itc MHz\s+:\s*([\d\.]+)/) { $itc_freq=$1; } + if (/^cpu MHz\s+:\s*([\d\.]+)/) { $cpu_freq=$1; } + elsif (/^itc MHz\s+:\s*([\d\.]+)/) { $itc_freq=$1; } + } + if (defined($itc_freq)) { + $mhz = $itc_freq; + } elsif (defined($cpu_freq)) { + $mhz = $cpu_freq; + } else { + $mhz = 1; } - if (defined($itc_freq)) { $mhz = $itc_freq; } - elsif (defined($cpu_freq)) { $mhz = $cpu_freq; } - else { $mhz = 1; } close CPUINFO; } get_cpumhz(); print "Processor counters run at $mhz MHz\n"; -# readstats subroutine reads statistics from obdfilter stats file. -# This subroutine gets called after every interval specified by user. +# read statistics from obdfilter stats file. +# This subroutine gets called after every interval specified by user. sub readstat() { - my $prevcount; - my @iodata; - - seek STATS, 0, 0; - while () { - chop; -# ($name, $cumulcount, $samples, $unit, $min, $max, $sum, $sumsquare) - @iodata = split(/\s+/, $_); - my $name = $iodata[0]; - - $prevcount = $cur{$name}; - if (defined($prevcount)) { - $last{$name} = $prevcount; - } - if ($name =~ /^read_bytes$/ || $name =~ /^write_bytes$/) { - $cur{$name} = $iodata[6]; - } - elsif ($name =~ /^snapshot_time$/) { -# $cumulcount =~ /(\d+)/; - $cur{$name} = $iodata[1]; - } - else { - $cur{$name} = $iodata[1]; - } - } + my $prevcount; + my @iodata; + + seek STATS, 0, 0; + while () { + chop; +# ($name, $cumulcount, $samples, $unit, $min, $max, $sum, $sumsquare) + @iodata = split(/\s+/, $_); + my $name = $iodata[0]; + + $prevcount = $cur{$name}; + if (defined($prevcount)) { + $last{$name} = $prevcount; + } + if ($name =~ /^read_bytes$/ || $name =~ /^write_bytes$/) { + $cur{$name} = $iodata[6]; + } + elsif ($name =~ /^snapshot_time$/) { +# $cumulcount =~ /(\d+)/; + $cur{$name} = $iodata[1]; + } else { + $cur{$name} = $iodata[1]; + } + } } -# process_stats subroutine processes stats information read from obdfilter stats file. -# This subroutine gets called after every interval specified by user. + +# process stats information read from obdfilter stats file. +# This subroutine gets called after every interval specified by user. sub process_stats() { - my $delta; - my $data; - my $last_time = $last{$snapshot_time}; - if (!defined($last_time)) { - printf "Read: %-g, Write: %-g, create/destroy: %-g/%-g, stat: %-g, punch: %-g\n", - $cur{$read_bytes}, $cur{$write_bytes}, - $cur{$create}, $cur{$destroy}, - $cur{$statfs}, $cur{$punch}; - if ($interval) { - print "[NOTE: cx: create, dx: destroy, st: statfs, pu: punch ]\n\n"; - print "Timestamp Read-delta ReadRate Write-delta WriteRate\n"; - print "--------------------------------------------------------\n"; - } - } - else { - my $timespan = $cur{$snapshot_time} - $last{$snapshot_time}; - my $rdelta = $cur{$read_bytes} - $last{$read_bytes}; - my $rrate = ($rdelta) / ($timespan * ( 1 << 20 )); - my $wdelta = $cur{$write_bytes} - $last{$write_bytes}; - my $wrate = ($wdelta) / ($timespan * ( 1 << 20 )); - $rdelta = ($rdelta) / (1024 * 1024); - $wdelta = ($wdelta) / (1024 * 1024); - # This print repeats after every interval. - printf "%10lu %6.2fMB %6.2fMB/s %6.2fMB %6.2fMB/s", - $cur{$snapshot_time}, $rdelta, $rrate, $wdelta, $wrate; - - $delta = $cur{$getattr} - $last{$getattr}; - if ( $delta != 0 ) { - $rdelta = int ($delta/$timespan); - print " ga:$delta,$rdelta/s"; - } - - for $data ( @extinfo ) { - $delta = $cur{$data} - $last{$data}; - if ($delta != 0) { - print " $shortname{$data}:$delta"; - } - } - print "\n"; - $| = 1; - } + my $delta; + my $data; + my $last_time = $last{$snapshot_time}; + if (!defined($last_time)) { + printf "Read: %-g, Write: %-g, create/destroy: %-g/%-g, stat: %-g, punch: %-g\n", + $cur{$read_bytes}, $cur{$write_bytes}, + $cur{$create}, $cur{$destroy}, + $cur{$statfs}, $cur{$punch}; + if ($interval) { + print "[NOTE: cx: create, dx: destroy, st: statfs, pu: punch ]\n\n"; + print "Timestamp Read-delta ReadRate Write-delta WriteRate\n"; + print "--------------------------------------------------------\n"; + } + } else { + my $timespan = $cur{$snapshot_time} - $last{$snapshot_time}; + my $rdelta = $cur{$read_bytes} - $last{$read_bytes}; + my $rrate = ($rdelta) / ($timespan * ( 1 << 20 )); + my $wdelta = $cur{$write_bytes} - $last{$write_bytes}; + my $wrate = ($wdelta) / ($timespan * ( 1 << 20 )); + $rdelta = ($rdelta) / (1024 * 1024); + $wdelta = ($wdelta) / (1024 * 1024); + # This print repeats after every interval. + printf "%10lu %6.2fMB %6.2fMB/s %6.2fMB %6.2fMB/s", + $cur{$snapshot_time}, $rdelta, $rrate, $wdelta, $wrate; + + $delta = $cur{$getattr} - $last{$getattr}; + if ( $delta != 0 ) { + $rdelta = int ($delta/$timespan); + print " ga:$delta,$rdelta/s"; + } + + for $data ( @extinfo ) { + $delta = $cur{$data} - $last{$data}; + if ($delta != 0) { + print " $shortname{$data}:$delta"; + } + } + print "\n"; + $| = 1; + } } + #Open the obdfilter stat file with STATS open(STATS, $statspath) || die "Cannot open $statspath: $!\n"; do { - readstat(); # read the statistics from stat file. - process_stats(); - if ($interval) { - sleep($interval); - %last = %cur; - } -} while ($interval); # Repeat the statistics printing after every "interval" specified in command line. + # read the statistics from stat file. + readstat(); + process_stats(); + if ($interval) { + sleep($interval); + %last = %cur; + } + # Repeat the statistics printing after every "interval" specified in + # command line, up to counter times, if specified +} while ($interval && (defined($counter) ? $counter-- > 0 : 1)); close STATS; # llobdfilter.pl ends here.