From a8e4a1f663412ceb2201055ce142e8a898e1f73b Mon Sep 17 00:00:00 2001 From: thantry Date: Fri, 16 May 2003 06:01:52 +0000 Subject: [PATCH] User space utiltity to format /proc/fs/lustre/...*_stat files. --- lustre/utils/llstat.pl | 122 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100755 lustre/utils/llstat.pl diff --git a/lustre/utils/llstat.pl b/lustre/utils/llstat.pl new file mode 100755 index 0000000..28eb778 --- /dev/null +++ b/lustre/utils/llstat.pl @@ -0,0 +1,122 @@ +#!/usr/bin/perl + +my $pname = $0; + +sub usage() +{ + print STDERR "Usage: $pname []\n"; + exit 1; +} + + +my $statspath; +my $interval = 0; + +if (($#ARGV < 0) || ($#ARGV > 1)) { + usage(); +} else { + $statspath = $ARGV[0]; + if ($#ARGV == 1) { + $interval = $ARGV[1]; + } +} + + + +my %namehash; +my $anysum = 0; +my $anysumsquare = 0; +my $mhz = 0; + +sub get_cpumhz() +{ + my $cpu_freq; + my $itc_freq; # On Itanium systems use this + if (open(CPUINFO, "/proc/cpuinfo")==0) { + return; + } + while () { + 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; } +} + +get_cpumhz(); +print "Processor counters run at $mhz MHz\n"; + +sub readstat() +{ + open(STATS, $statspath) || die "Cannot open $statspath: $!\n"; + while () { + chop; + ($name, $cumulcount, $samples, $unit, $min, $max, $sum, $sumsquare) + = split(/\s+/, $_); + + $prevcount = %namehash->{$name}; + if (defined($prevcount)) { + $diff = $cumulcount - $prevcount; + if ($name eq "snapshot_time") { + $tdiff = $diff; + # printf "%-25s prev=$prevcount, cumul=$cumulcount diff=$diff, tdiff=$tdiff\n", $name; + printf "$statspath @ $cumulcount\n"; + printf "%-25s %-10s %-10s %-10s", "Name", "Cur.Count", "Cur.Rate", "#Events"; + if ($anysum) { + printf "%-8s %10s %12s %10s", "Unit", "min", "avg", "max"; + } + if ($anysumsquare) { + printf "%10s", "stddev"; + } + printf "\n"; + } + elsif ($cumulcount!=0) { + printf "%-25s %-10Lu %-10Lu %-10Lu", + $name, $diff, ($diff/$tdiff), $cumulcount; + + if (defined($sum)) { + my $sum_orig = $sum; + if (($unit eq "[cycles]") && ($mhz != 1)) { + $unit = "[usecs]"; + $min = $min/$mhz; + $sum = $sum/$mhz; + $max = $max/$mhz; + } + printf "%-8s %10Lu %12.2f %10Lu", $unit, $min, ($sum/$cumulcount), $max; + if (defined($sumsquare)) { + my $s = $sumsquare - (($sum_orig*$sum_orig)/$cumulcount); + if ($s >= 0) { + my $cnt = ($cumulcount >= 2) ? $cumulcount : 2 ; + my $stddev = sqrt($s/($cnt - 1)); + if (($unit eq "[usecs]") && ($mhz != 1)) { + $stddev = $stddev/$mhz; + } + printf " %10.2f", $stddev; + } + } + } + printf "\n"; + } + } + else { + if ($cumulcount!=0) { + printf "%-25s $cumulcount\n", $name + } + if (defined($sum)) { + $anysum = 1; + } + if (defined($sumsquare)) { + $anysumsquare = 1; + } + } + %namehash->{$name} = $cumulcount; + } +} + +do { + readstat(); + if ($interval) { + sleep($interval); + } +} while ($interval); -- 1.8.3.1