5 my $defaultpath = "/proc/fs/lustre";
6 my $obdstats = "stats";
10 print STDERR "Usage: $pname <stats_file> [<interval>]\n";
11 print STDERR "example: $pname help (to get help message)\n";
12 print STDERR "example: $pname ost1 1 (monitor /proc/fs/lustre/obdfilter/ost1/stats\n";
16 my $statspath = "None";
19 if (($#ARGV < 0) || ($#ARGV > 1)) {
22 if ( $ARGV[0] =~ /help$/ ) {
26 $statspath = $ARGV[0];
27 } elsif ( -f "$ARGV[0]/$obdstats" ) {
28 $statspath = "$ARGV[0]/$obdstats";
30 my $st = `ls $defaultpath/*/$ARGV[0]/$obdstats 2> /dev/null`;
36 if ( $statspath =~ /^None$/ ) {
37 die "Cannot locate stat file for: $ARGV[0]\n";
44 print "$pname on $statspath\n";
49 my ($read_bytes, $read, $write_bytes, $write, $getattr, $setattr, $open, $close, $create, $destroy, $statfs, $punch, $snapshot_time) =
50 ("read_bytes", "read", "write_bytes", "write", "getattr", "setattr", "open", "close", "create", "destroy", "statfs", "punch", "snapshot_time");
52 my @extinfo = ($setattr, $open, $close, $create, $destroy, $statfs, $punch);
53 my %shortname = ($setattr => "sa", $open => "op", $close => "cl",
54 $create => "cx", $destroy => "dx", $statfs => "st", $punch => "pu");
59 my $itc_freq; # On Itanium systems use this
60 if (open(CPUINFO, "/proc/cpuinfo")==0) {
64 if (/^cpu MHz\s+:\s*([\d\.]+)/) { $cpu_freq=$1; }
65 elsif (/^itc MHz\s+:\s*([\d\.]+)/) { $itc_freq=$1; }
67 if (defined($itc_freq)) { $mhz = $itc_freq; }
68 elsif (defined($cpu_freq)) { $mhz = $cpu_freq; }
74 print "Processor counters run at $mhz MHz\n";
84 # ($name, $cumulcount, $samples, $unit, $min, $max, $sum, $sumsquare)
85 @iodata = split(/\s+/, $_);
86 my $name = $iodata[0];
88 $prevcount = $cur{$name};
89 if (defined($prevcount)) {
90 $last{$name} = $prevcount;
92 if ($name =~ /^read_bytes$/ || $name =~ /^write_bytes$/) {
93 $cur{$name} = $iodata[6];
95 elsif ($name =~ /^snapshot_time$/) {
96 # $cumulcount =~ /(\d+)/;
97 $cur{$name} = $iodata[1];
100 $cur{$name} = $iodata[1];
108 my $last_time = $last{$snapshot_time};
109 if (!defined($last_time)) {
110 printf "R %-g/%-g W %-g/%-g attr %-g/%-g open %-g/%-g create %-g/%-g stat %-g punch %-g\n",
111 $cur{$read_bytes}, $cur{$read},
112 $cur{$write_bytes}, $cur{$write},
113 $cur{$getattr}, $cur{$setattr},
114 $cur{$open}, $cur{$close},
115 $cur{$create}, $cur{$destroy},
116 $cur{$statfs}, $cur{$punch};
119 my $timespan = $cur{$snapshot_time} - $last{$snapshot_time};
121 my $rdelta = $cur{$read} - $last{$read};
122 my $rvdelta = int ($rdelta / $timespan);
123 my $rrate = ($cur{$read_bytes} - $last{$read_bytes}) /
124 ($timespan * ( 1 << 20 ));
125 my $wdelta = $cur{$write} - $last{$write};
126 my $wvdelta = int ($wdelta / $timespan);
127 my $wrate = ($cur{$write_bytes} - $last{$write_bytes}) /
128 ($timespan * ( 1 << 20 ));
129 printf "R %6lu (%5lu %6.2fMB)/s W %6lu (%5lu %6.2fMB)/s",
130 $rdelta, $rvdelta, $rrate,
131 $wdelta, $wvdelta, $wrate;
133 $delta = $cur{$getattr} - $last{$getattr};
135 $rdelta = int ($delta/$timespan);
136 print " ga:$delta,$rdelta/s";
139 for $data ( @extinfo ) {
140 $delta = $cur{$data} - $last{$data};
142 print " $shortname{$data}:$delta";
150 open(STATS, $statspath) || die "Cannot open $statspath: $!\n";