Whamcloud - gitweb
- merge 0.7rc1 from b_devel to HEAD (20030612 merge point)
[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             }
74             elsif ($cumulcount!=0) {
75                 printf "%-25s %-10Lu %-10Lu %-10Lu",
76                        $name, $diff, ($diff/$tdiff), $cumulcount;
77                 
78                 if (defined($sum)) {
79                     my $sum_orig = $sum;
80                     if (($unit eq "[cycles]") && ($mhz != 1)) {
81                         $unit = "[usecs]";
82                         $min = $min/$mhz;
83                         $sum = $sum/$mhz;
84                         $max = $max/$mhz;
85                     }
86                     printf "%-8s %10Lu %12.2f %10Lu", $unit, $min, ($sum/$cumulcount), $max;
87                     if (defined($sumsquare)) {
88                         my $s = $sumsquare - (($sum_orig*$sum_orig)/$cumulcount);
89                         if ($s >= 0) {
90                             my $cnt = ($cumulcount >= 2) ? $cumulcount : 2 ;
91                             my $stddev = sqrt($s/($cnt - 1));
92                             if (($unit eq "[usecs]") && ($mhz != 1)) {
93                                 $stddev = $stddev/$mhz;
94                             }
95                             printf " %10.2f", $stddev;
96                         }
97                     }
98                 }
99                 printf "\n";
100             }
101         }
102         else {
103             if ($cumulcount!=0) {
104                 printf "%-25s $cumulcount\n", $name     
105             }
106             if (defined($sum)) {
107                 $anysum = 1;
108             }
109             if (defined($sumsquare)) {
110                 $anysumsquare = 1;
111             }
112         }
113         %namehash->{$name} = $cumulcount;
114     }
115 }
116
117 do {
118     readstat();
119     if ($interval) { 
120         sleep($interval);
121     }
122 } while ($interval);