Whamcloud - gitweb
merge b_devel into HEAD (20030626 merge tag) for 0.7.1
[fs/lustre-release.git] / lustre / utils / llstat.pl
1 #!/usr/bin/perl
2
3 my $pname = $0;
4
5 sub usage()
6 {
7     print STDERR "Usage: $pname <stats_file> [<interval>]\n";
8     exit 1;
9 }
10
11
12 my $statspath;
13 my $interval = 0;
14
15 if (($#ARGV < 0) || ($#ARGV > 1)) {
16     usage();
17 } else {
18     $statspath = $ARGV[0];
19     if ($#ARGV == 1) {
20         $interval = $ARGV[1];
21     } 
22 }
23
24
25
26 my %namehash;
27 my $anysum = 0;
28 my $anysumsquare = 0;
29 my $mhz = 0;
30
31 sub get_cpumhz()
32 {
33     my $cpu_freq;
34     my $itc_freq; # On Itanium systems use this
35     if (open(CPUINFO, "/proc/cpuinfo")==0) {
36         return;
37     }
38     while (<CPUINFO>) {
39         if (/^cpu MHz\s+:\s*([\d\.]+)/) { $cpu_freq=$1; }
40         elsif (/^itc MHz\s+:\s*([\d\.]+)/) { $itc_freq=$1; }
41     }
42     if (defined($itc_freq)) { $mhz = $itc_freq; }
43     elsif (defined($cpu_freq)) { $mhz = $cpu_freq; }
44     else { $mhz = 1; }
45 }
46
47 get_cpumhz();
48 print "Processor counters run at $mhz MHz\n";
49
50 sub readstat()
51 {
52     open(STATS, $statspath) || die "Cannot open $statspath: $!\n";
53     while (<STATS>) {
54         chop;
55         ($name, $cumulcount, $samples, $unit, $min, $max, $sum, $sumsquare) 
56             = split(/\s+/, $_);
57
58         $prevcount = %namehash->{$name};
59         if (defined($prevcount)) {
60             $diff = $cumulcount - $prevcount;
61             if ($name eq "snapshot_time") {
62                 $tdiff = $diff;
63                 # printf "%-25s prev=$prevcount, cumul=$cumulcount diff=$diff, tdiff=$tdiff\n", $name;
64                 printf "$statspath @ $cumulcount\n";
65                 printf "%-25s %-10s %-10s %-10s", "Name", "Cur.Count", "Cur.Rate", "#Events";
66                 if ($anysum) {
67                     printf "%-8s %10s %12s %10s", "Unit", "min", "avg", "max";
68                 }
69                 if ($anysumsquare) {
70                     printf "%10s", "stddev";
71                 }
72                 printf "\n";
73                 $| = 1;
74             }
75             elsif ($cumulcount!=0) {
76                 printf "%-25s %-10lu %-10lu %-10lu",
77                        $name, $diff, ($diff/$tdiff), $cumulcount;
78                 
79                 if (defined($sum)) {
80                     my $sum_orig = $sum;
81                     if (($unit eq "[cycles]") && ($mhz != 1)) {
82                         $unit = "[usecs]";
83                         $min = $min/$mhz;
84                         $sum = $sum/$mhz;
85                         $max = $max/$mhz;
86                     }
87                     printf "%-8s %10lu %12.2f %10lu", $unit, $min, ($sum/$cumulcount), $max;
88                     if (defined($sumsquare)) {
89                         my $s = $sumsquare - (($sum_orig*$sum_orig)/$cumulcount);
90                         if ($s >= 0) {
91                             my $cnt = ($cumulcount >= 2) ? $cumulcount : 2 ;
92                             my $stddev = sqrt($s/($cnt - 1));
93                             if (($unit eq "[usecs]") && ($mhz != 1)) {
94                                 $stddev = $stddev/$mhz;
95                             }
96                             printf " %10.2f", $stddev;
97                         }
98                     }
99                 }
100                 printf "\n";
101                 $| = 1;
102             }
103         }
104         else {
105             if ($cumulcount!=0) {
106                 printf "%-25s $cumulcount\n", $name     
107             }
108             if (defined($sum)) {
109                 $anysum = 1;
110             }
111             if (defined($sumsquare)) {
112                 $anysumsquare = 1;
113             }
114         }
115         %namehash->{$name} = $cumulcount;
116     }
117 }
118
119 do {
120     readstat();
121     if ($interval) { 
122         sleep($interval);
123     }
124 } while ($interval);