Whamcloud - gitweb
Branch b1_4_mountconf
[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 %cumulhash;
27 my %sumhash;
28 my $anysum = 0;
29 my $anysumsquare = 0;
30 my $mhz = 0;
31
32 sub get_cpumhz()
33 {
34     my $cpu_freq;
35     my $itc_freq; # On Itanium systems use this
36     if (open(CPUINFO, "/proc/cpuinfo")==0) {
37         return;
38     }
39     while (<CPUINFO>) {
40         if (/^cpu MHz\s+:\s*([\d\.]+)/) { $cpu_freq=$1; }
41         elsif (/^itc MHz\s+:\s*([\d\.]+)/) { $itc_freq=$1; }
42     }
43     if (defined($itc_freq)) { $mhz = $itc_freq; }
44     elsif (defined($cpu_freq)) { $mhz = $cpu_freq; }
45     else { $mhz = 1; }
46 }
47
48 get_cpumhz();
49 print "Processor counters run at $mhz MHz\n";
50
51 sub readstat()
52 {
53     open(STATS, $statspath) || die "Cannot open $statspath: $!\n";
54     while (<STATS>) {
55         chop;
56         ($name, $cumulcount, $samples, $unit, $min, $max, $sum, $sumsquare) 
57             = split(/\s+/, $_);
58
59         $prevcount = %cumulhash->{$name};
60         if (defined($prevcount)) {
61             $diff = $cumulcount - $prevcount;
62             if ($name eq "snapshot_time") {
63                 $tdiff = $diff;
64                 # printf "%-25s prev=$prevcount, cumul=$cumulcount diff=$diff, tdiff=$tdiff\n", $name;
65                 printf "$statspath @ $cumulcount\n";
66                 printf "%-25s %-10s %-10s %-10s", "Name", "Cur.Count", "Cur.Rate", "#Events";
67                 if ($anysum) {
68                     printf "%-8s %10s %10s %12s %10s", "Unit", "last", "min", "avg", "max";
69                 }
70                 if ($anysumsquare) {
71                     printf "%10s", "stddev";
72                 }
73                 printf "\n";
74                 $| = 1;
75             }
76             elsif ($cumulcount!=0) {
77                 printf "%-25s %-10lu %-10lu %-10lu",
78                        $name, $diff, ($diff/$tdiff), $cumulcount;
79                 
80                 if (defined($sum)) {
81                     my $sum_orig = $sum;
82                     my $sum_diff = $sum - %sumhash->{$name};
83
84             #printf "\n%-25s diff=$diff, sum=$sum sumhash=%10s sum_diff=$sum_diff\n", $name, %sumhash->{$name};
85                     if ($diff == 0) {
86                         $diff = 1; # avoid division by zero
87                     }
88                     if (($unit eq "[cycles]") && ($mhz != 1)) {
89                         $unit = "[usecs]";
90                         $min = $min/$mhz;
91                         $sum = $sum/$mhz;
92                         $sum_diff = $sum_diff/$mhz;
93                         $max = $max/$mhz;
94                     }
95                     printf "%-8s %10.2f %10lu %12.2f %10lu", $unit, ($sum_diff/$diff), $min,($sum/$cumulcount),$max;
96                     if (defined($sumsquare)) {
97                         my $s = $sumsquare - (($sum_orig*$sum_orig)/$cumulcount);
98                         if ($s >= 0) {
99                             my $cnt = ($cumulcount >= 2) ? $cumulcount : 2 ;
100                             my $stddev = sqrt($s/($cnt - 1));
101                             if (($unit eq "[usecs]") && ($mhz != 1)) {
102                                 $stddev = $stddev/$mhz;
103                             }
104                             printf " %10.2f", $stddev;
105                         }
106                     }
107                 }
108                 printf "\n";
109                 $| = 1;
110             }
111         }
112         else {
113             if ($cumulcount!=0) {
114                 printf "%-25s $cumulcount\n", $name     
115             }
116             if (defined($sum)) {
117                 $anysum = 1;
118             }
119             if (defined($sumsquare)) {
120                 $anysumsquare = 1;
121             }
122         }
123         %cumulhash->{$name} = $cumulcount;
124         %sumhash->{$name} = $sum;
125     }
126 }
127
128 do {
129     readstat();
130     if ($interval) { 
131         sleep($interval);
132     }
133 } while ($interval);