xref: /titanic_53/usr/src/cmd/stat/arcstat/arcstat.pl (revision d0054224e0ba320a05d1c27de508dc5224ff99d1)
1*d0054224SAdam Stevko#!/usr/perl5/bin/perl -w
2*d0054224SAdam Stevko# The above invocation line was changed in 0.5 to allow for
3*d0054224SAdam Stevko# interoperability with linux.
4*d0054224SAdam Stevko#
5*d0054224SAdam Stevko# Print out ZFS ARC Statistics exported via kstat(1)
6*d0054224SAdam Stevko# For a definition of fields, or usage, use arctstat.pl -v
7*d0054224SAdam Stevko#
8*d0054224SAdam Stevko# This script is a fork of the original arcstat.pl (0.1) by
9*d0054224SAdam Stevko# Neelakanth Nadgir, originally published on his Sun blog on
10*d0054224SAdam Stevko# 09/18/2007
11*d0054224SAdam Stevko#     http://blogs.sun.com/realneel/entry/zfs_arc_statistics
12*d0054224SAdam Stevko#
13*d0054224SAdam Stevko# This version aims to improve upon the original by adding features
14*d0054224SAdam Stevko# and fixing bugs as needed.  This version is maintained by
15*d0054224SAdam Stevko# Mike Harsch and is hosted in a public open source repository:
16*d0054224SAdam Stevko#    http://github.com/mharsch/arcstat
17*d0054224SAdam Stevko#
18*d0054224SAdam Stevko# Comments, Questions, or Suggestions are always welcome.
19*d0054224SAdam Stevko# Contact the maintainer at ( mike at harschsystems dot com )
20*d0054224SAdam Stevko#
21*d0054224SAdam Stevko# CDDL HEADER START
22*d0054224SAdam Stevko#
23*d0054224SAdam Stevko# The contents of this file are subject to the terms of the
24*d0054224SAdam Stevko# Common Development and Distribution License, Version 1.0 only
25*d0054224SAdam Stevko# (the "License").  You may not use this file except in compliance
26*d0054224SAdam Stevko# with the License.
27*d0054224SAdam Stevko#
28*d0054224SAdam Stevko# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
29*d0054224SAdam Stevko# or http://www.opensolaris.org/os/licensing.
30*d0054224SAdam Stevko# See the License for the specific language governing permissions
31*d0054224SAdam Stevko# and limitations under the License.
32*d0054224SAdam Stevko#
33*d0054224SAdam Stevko# When distributing Covered Code, include this CDDL HEADER in each
34*d0054224SAdam Stevko# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
35*d0054224SAdam Stevko# If applicable, add the following below this CDDL HEADER, with the
36*d0054224SAdam Stevko# fields enclosed by brackets "[]" replaced with your own identifying
37*d0054224SAdam Stevko# information: Portions Copyright [yyyy] [name of copyright owner]
38*d0054224SAdam Stevko#
39*d0054224SAdam Stevko# CDDL HEADER END
40*d0054224SAdam Stevko#
41*d0054224SAdam Stevko#
42*d0054224SAdam Stevko# Fields have a fixed width. Every interval, we fill the "v"
43*d0054224SAdam Stevko# hash with its corresponding value (v[field]=value) using calculate().
44*d0054224SAdam Stevko# @hdr is the array of fields that needs to be printed, so we
45*d0054224SAdam Stevko# just iterate over this array and print the values using our pretty printer.
46*d0054224SAdam Stevko
47*d0054224SAdam Stevkouse strict;
48*d0054224SAdam Stevkouse warnings;
49*d0054224SAdam Stevkouse POSIX qw(strftime);
50*d0054224SAdam Stevkouse Sun::Solaris::Kstat;
51*d0054224SAdam Stevkouse Getopt::Long;
52*d0054224SAdam Stevkouse IO::Handle;
53*d0054224SAdam Stevko
54*d0054224SAdam Stevkomy %cols = (# HDR => [Size, Scale, Description]
55*d0054224SAdam Stevko	"time"		=>[8, -1, "Time"],
56*d0054224SAdam Stevko	"hits"		=>[4, 1000, "ARC reads per second"],
57*d0054224SAdam Stevko	"miss"		=>[4, 1000, "ARC misses per second"],
58*d0054224SAdam Stevko	"read"		=>[4, 1000, "Total ARC accesses per second"],
59*d0054224SAdam Stevko	"hit%"		=>[4, 100, "ARC Hit percentage"],
60*d0054224SAdam Stevko	"miss%"		=>[5, 100, "ARC miss percentage"],
61*d0054224SAdam Stevko	"dhit"		=>[4, 1000, "Demand Data hits per second"],
62*d0054224SAdam Stevko	"dmis"		=>[4, 1000, "Demand Data misses per second"],
63*d0054224SAdam Stevko	"dh%"		=>[3, 100, "Demand Data hit percentage"],
64*d0054224SAdam Stevko	"dm%"		=>[3, 100, "Demand Data miss percentage"],
65*d0054224SAdam Stevko	"phit"		=>[4, 1000, "Prefetch hits per second"],
66*d0054224SAdam Stevko	"pmis"		=>[4, 1000, "Prefetch misses per second"],
67*d0054224SAdam Stevko	"ph%"		=>[3, 100, "Prefetch hits percentage"],
68*d0054224SAdam Stevko	"pm%"		=>[3, 100, "Prefetch miss percentage"],
69*d0054224SAdam Stevko	"mhit"		=>[4, 1000, "Metadata hits per second"],
70*d0054224SAdam Stevko	"mmis"		=>[4, 1000, "Metadata misses per second"],
71*d0054224SAdam Stevko	"mread"		=>[4, 1000, "Metadata accesses per second"],
72*d0054224SAdam Stevko	"mh%"		=>[3, 100, "Metadata hit percentage"],
73*d0054224SAdam Stevko	"mm%"		=>[3, 100, "Metadata miss percentage"],
74*d0054224SAdam Stevko	"arcsz"		=>[5, 1024, "ARC Size"],
75*d0054224SAdam Stevko	"c" 		=>[4, 1024, "ARC Target Size"],
76*d0054224SAdam Stevko	"mfu" 		=>[4, 1000, "MFU List hits per second"],
77*d0054224SAdam Stevko	"mru" 		=>[4, 1000, "MRU List hits per second"],
78*d0054224SAdam Stevko	"mfug" 		=>[4, 1000, "MFU Ghost List hits per second"],
79*d0054224SAdam Stevko	"mrug" 		=>[4, 1000, "MRU Ghost List hits per second"],
80*d0054224SAdam Stevko	"eskip"		=>[5, 1000, "evict_skip per second"],
81*d0054224SAdam Stevko	"mtxmis"	=>[6, 1000, "mutex_miss per second"],
82*d0054224SAdam Stevko	"rmis"		=>[4, 1000, "recycle_miss per second"],
83*d0054224SAdam Stevko	"dread"		=>[5, 1000, "Demand data accesses per second"],
84*d0054224SAdam Stevko	"pread"		=>[5, 1000, "Prefetch accesses per second"],
85*d0054224SAdam Stevko	"l2hits"	=>[6, 1000, "L2ARC hits per second"],
86*d0054224SAdam Stevko	"l2miss"	=>[6, 1000, "L2ARC misses per second"],
87*d0054224SAdam Stevko	"l2read"	=>[6, 1000, "Total L2ARC accesses per second"],
88*d0054224SAdam Stevko	"l2hit%"	=>[6, 100, "L2ARC access hit percentage"],
89*d0054224SAdam Stevko	"l2miss%"	=>[7, 100, "L2ARC access miss percentage"],
90*d0054224SAdam Stevko	"l2asize"       =>[7, 1024, "Actual (compressed) size of the L2ARC"],
91*d0054224SAdam Stevko	"l2size"	=>[6, 1024, "Size of the L2ARC"],
92*d0054224SAdam Stevko	"l2bytes"	=>[7, 1024, "bytes read per second from the L2ARC"],
93*d0054224SAdam Stevko);
94*d0054224SAdam Stevkomy %v=();
95*d0054224SAdam Stevkomy @hdr = qw(time read miss miss% dmis dm% pmis pm% mmis mm% arcsz c);
96*d0054224SAdam Stevkomy @xhdr = qw(time mfu mru mfug mrug eskip mtxmis rmis dread pread read);
97*d0054224SAdam Stevkomy $int = 1;		# Default interval is 1 second
98*d0054224SAdam Stevkomy $count = 1;		# Default count is 1
99*d0054224SAdam Stevkomy $hdr_intr = 20;	# Print header every 20 lines of output
100*d0054224SAdam Stevkomy $opfile = "";
101*d0054224SAdam Stevkomy $sep = "  ";		# Default separator is 2 spaces
102*d0054224SAdam Stevkomy $raw_output;
103*d0054224SAdam Stevkomy $version = "0.5";
104*d0054224SAdam Stevkomy $l2exist = 0;
105*d0054224SAdam Stevkomy $cmd = "Usage: arcstat [-hvxr] [-f fields] [-o file] [-s string] " .
106*d0054224SAdam Stevko    "[interval [count]]\n";
107*d0054224SAdam Stevkomy %cur;
108*d0054224SAdam Stevkomy %d;
109*d0054224SAdam Stevkomy $out;
110*d0054224SAdam Stevkomy $kstat = Sun::Solaris::Kstat->new();
111*d0054224SAdam StevkoSTDOUT->autoflush;
112*d0054224SAdam Stevko
113*d0054224SAdam Stevkosub detailed_usage {
114*d0054224SAdam Stevko	print STDERR "$cmd\n";
115*d0054224SAdam Stevko	print STDERR "Field definitions are as follows:\n";
116*d0054224SAdam Stevko	foreach my $hdr (keys %cols) {
117*d0054224SAdam Stevko		print STDERR sprintf("%11s : %s\n", $hdr, $cols{$hdr}[2]);
118*d0054224SAdam Stevko	}
119*d0054224SAdam Stevko	exit(1);
120*d0054224SAdam Stevko}
121*d0054224SAdam Stevko
122*d0054224SAdam Stevkosub usage {
123*d0054224SAdam Stevko	print STDERR "$cmd\n";
124*d0054224SAdam Stevko	print STDERR "\t -h : Print this help message\n";
125*d0054224SAdam Stevko	print STDERR "\t -v : List all possible field headers " .
126*d0054224SAdam Stevko	    "and definitions\n";
127*d0054224SAdam Stevko	print STDERR "\t -x : Print extended stats\n";
128*d0054224SAdam Stevko	print STDERR "\t -r : Raw output mode (values not scaled)\n";
129*d0054224SAdam Stevko	print STDERR "\t -f : Specify specific fields to print (see -v)\n";
130*d0054224SAdam Stevko	print STDERR "\t -o : Redirect output to the specified file\n";
131*d0054224SAdam Stevko	print STDERR "\t -s : Override default field separator with custom " .
132*d0054224SAdam Stevko	    "character or string\n";
133*d0054224SAdam Stevko	print STDERR "\nExamples:\n";
134*d0054224SAdam Stevko	print STDERR "\tarcstat -o /tmp/a.log 2 10\n";
135*d0054224SAdam Stevko	print STDERR "\tarcstat -s \",\" -o /tmp/a.log 2 10\n";
136*d0054224SAdam Stevko	print STDERR "\tarcstat -v\n";
137*d0054224SAdam Stevko	print STDERR "\tarcstat -f time,hit%,dh%,ph%,mh% 1\n";
138*d0054224SAdam Stevko	exit(1);
139*d0054224SAdam Stevko}
140*d0054224SAdam Stevko
141*d0054224SAdam Stevkosub init {
142*d0054224SAdam Stevko	my $desired_cols;
143*d0054224SAdam Stevko	my $xflag = '';
144*d0054224SAdam Stevko	my $hflag = '';
145*d0054224SAdam Stevko	my $vflag;
146*d0054224SAdam Stevko	my $res = GetOptions('x' => \$xflag,
147*d0054224SAdam Stevko	    'o=s' => \$opfile,
148*d0054224SAdam Stevko	    'help|h|?' => \$hflag,
149*d0054224SAdam Stevko	    'v' => \$vflag,
150*d0054224SAdam Stevko	    's=s' => \$sep,
151*d0054224SAdam Stevko	    'f=s' => \$desired_cols,
152*d0054224SAdam Stevko	    'r' => \$raw_output);
153*d0054224SAdam Stevko
154*d0054224SAdam Stevko	if (defined $ARGV[0] && defined $ARGV[1]) {
155*d0054224SAdam Stevko		$int = $ARGV[0];
156*d0054224SAdam Stevko		$count = $ARGV[1];
157*d0054224SAdam Stevko	} elsif (defined $ARGV[0]) {
158*d0054224SAdam Stevko		$int = $ARGV[0];
159*d0054224SAdam Stevko		$count = 0;
160*d0054224SAdam Stevko	}
161*d0054224SAdam Stevko
162*d0054224SAdam Stevko	usage() if !$res or $hflag or ($xflag and $desired_cols);
163*d0054224SAdam Stevko	detailed_usage() if $vflag;
164*d0054224SAdam Stevko	@hdr = @xhdr if $xflag;		#reset headers to xhdr
165*d0054224SAdam Stevko
166*d0054224SAdam Stevko	# check if L2ARC exists
167*d0054224SAdam Stevko	snap_stats();
168*d0054224SAdam Stevko	if (defined $cur{"l2_size"}) {
169*d0054224SAdam Stevko		$l2exist = 1;
170*d0054224SAdam Stevko	}
171*d0054224SAdam Stevko
172*d0054224SAdam Stevko	if ($desired_cols) {
173*d0054224SAdam Stevko		@hdr = split(/[ ,]+/, $desired_cols);
174*d0054224SAdam Stevko		# Now check if they are valid fields
175*d0054224SAdam Stevko		my @invalid = ();
176*d0054224SAdam Stevko		my @incompat = ();
177*d0054224SAdam Stevko		foreach my $ele (@hdr) {
178*d0054224SAdam Stevko			if (not exists($cols{$ele})) {
179*d0054224SAdam Stevko				push(@invalid, $ele);
180*d0054224SAdam Stevko			} elsif (($l2exist == 0) && ($ele =~ /^l2/)) {
181*d0054224SAdam Stevko				printf("No L2ARC here\n", $ele);
182*d0054224SAdam Stevko				push(@incompat, $ele);
183*d0054224SAdam Stevko			}
184*d0054224SAdam Stevko		}
185*d0054224SAdam Stevko		if (scalar @invalid > 0) {
186*d0054224SAdam Stevko			print STDERR "Invalid column definition! -- "
187*d0054224SAdam Stevko			    . "@invalid\n\n";
188*d0054224SAdam Stevko			usage();
189*d0054224SAdam Stevko		}
190*d0054224SAdam Stevko
191*d0054224SAdam Stevko		if (scalar @incompat > 0) {
192*d0054224SAdam Stevko			print STDERR "Incompatible field specified -- "
193*d0054224SAdam Stevko			    . "@incompat\n\n";
194*d0054224SAdam Stevko			usage();
195*d0054224SAdam Stevko		}
196*d0054224SAdam Stevko	}
197*d0054224SAdam Stevko
198*d0054224SAdam Stevko	if ($opfile) {
199*d0054224SAdam Stevko		open($out, ">$opfile") ||die "Cannot open $opfile for writing";
200*d0054224SAdam Stevko		$out->autoflush;
201*d0054224SAdam Stevko		select $out;
202*d0054224SAdam Stevko	}
203*d0054224SAdam Stevko}
204*d0054224SAdam Stevko
205*d0054224SAdam Stevko# Capture kstat statistics. We maintain 3 hashes, prev, cur, and
206*d0054224SAdam Stevko# d (delta). As their names imply they maintain the previous, current,
207*d0054224SAdam Stevko# and delta (cur - prev) statistics.
208*d0054224SAdam Stevkosub snap_stats {
209*d0054224SAdam Stevko	my %prev = %cur;
210*d0054224SAdam Stevko	if ($kstat->update()) {
211*d0054224SAdam Stevko		printf("<State Changed>\n");
212*d0054224SAdam Stevko	}
213*d0054224SAdam Stevko	my $hashref_cur = $kstat->{"zfs"}{0}{"arcstats"};
214*d0054224SAdam Stevko	%cur = %$hashref_cur;
215*d0054224SAdam Stevko	foreach my $key (keys %cur) {
216*d0054224SAdam Stevko		next if $key =~ /class/;
217*d0054224SAdam Stevko		if (defined $prev{$key}) {
218*d0054224SAdam Stevko			$d{$key} = $cur{$key} - $prev{$key};
219*d0054224SAdam Stevko		} else {
220*d0054224SAdam Stevko			$d{$key} = $cur{$key};
221*d0054224SAdam Stevko		}
222*d0054224SAdam Stevko	}
223*d0054224SAdam Stevko}
224*d0054224SAdam Stevko
225*d0054224SAdam Stevko# Pretty print num. Arguments are width, scale, and num
226*d0054224SAdam Stevkosub prettynum {
227*d0054224SAdam Stevko	my @suffix = (' ', 'K', 'M', 'G', 'T');
228*d0054224SAdam Stevko	my $num = $_[2] || 0;
229*d0054224SAdam Stevko	my $scale = $_[1];
230*d0054224SAdam Stevko	my $sz = $_[0];
231*d0054224SAdam Stevko	my $index = 0;
232*d0054224SAdam Stevko	my $save = 0;
233*d0054224SAdam Stevko
234*d0054224SAdam Stevko	if ($scale == -1) {			#special case for date field
235*d0054224SAdam Stevko		return sprintf("%s", $num);
236*d0054224SAdam Stevko	} elsif (($num > 0) && ($num < 1)) {	#rounding error.  return 0
237*d0054224SAdam Stevko		$num = 0;
238*d0054224SAdam Stevko	}
239*d0054224SAdam Stevko
240*d0054224SAdam Stevko	while ($num > $scale and $index < 5) {
241*d0054224SAdam Stevko		$save = $num;
242*d0054224SAdam Stevko		$num = $num/$scale;
243*d0054224SAdam Stevko		$index++;
244*d0054224SAdam Stevko	}
245*d0054224SAdam Stevko
246*d0054224SAdam Stevko	return sprintf("%*d", $sz, $num) if ($index == 0);
247*d0054224SAdam Stevko	if (($save / $scale) < 10) {
248*d0054224SAdam Stevko		return sprintf("%*.1f%s", $sz - 1, $num,$suffix[$index]);
249*d0054224SAdam Stevko	} else {
250*d0054224SAdam Stevko		return sprintf("%*d%s", $sz - 1, $num,$suffix[$index]);
251*d0054224SAdam Stevko	}
252*d0054224SAdam Stevko}
253*d0054224SAdam Stevko
254*d0054224SAdam Stevkosub print_values {
255*d0054224SAdam Stevko	foreach my $col (@hdr) {
256*d0054224SAdam Stevko		if (not $raw_output) {
257*d0054224SAdam Stevko			printf("%s%s", prettynum($cols{$col}[0], $cols{$col}[1],
258*d0054224SAdam Stevko			    $v{$col}), $sep);
259*d0054224SAdam Stevko		} else {
260*d0054224SAdam Stevko			printf("%d%s", $v{$col} || 0, $sep);
261*d0054224SAdam Stevko		}
262*d0054224SAdam Stevko	}
263*d0054224SAdam Stevko	printf("\n");
264*d0054224SAdam Stevko}
265*d0054224SAdam Stevko
266*d0054224SAdam Stevkosub print_header {
267*d0054224SAdam Stevko	if (not $raw_output) {
268*d0054224SAdam Stevko		foreach my $col (@hdr) {
269*d0054224SAdam Stevko			printf("%*s%s", $cols{$col}[0], $col, $sep);
270*d0054224SAdam Stevko		}
271*d0054224SAdam Stevko	} else {
272*d0054224SAdam Stevko		# Don't try to align headers in raw mode
273*d0054224SAdam Stevko		foreach my $col (@hdr) {
274*d0054224SAdam Stevko			printf("%s%s", $col, $sep);
275*d0054224SAdam Stevko		}
276*d0054224SAdam Stevko	}
277*d0054224SAdam Stevko	printf("\n");
278*d0054224SAdam Stevko}
279*d0054224SAdam Stevko
280*d0054224SAdam Stevkosub calculate {
281*d0054224SAdam Stevko	%v = ();
282*d0054224SAdam Stevko
283*d0054224SAdam Stevko	if ($raw_output) {
284*d0054224SAdam Stevko		$v{"time"} = strftime("%s", localtime);
285*d0054224SAdam Stevko	} else {
286*d0054224SAdam Stevko		$v{"time"} = strftime("%H:%M:%S", localtime);
287*d0054224SAdam Stevko	}
288*d0054224SAdam Stevko
289*d0054224SAdam Stevko	$v{"hits"} = $d{"hits"}/$int;
290*d0054224SAdam Stevko	$v{"miss"} = $d{"misses"}/$int;
291*d0054224SAdam Stevko	$v{"read"} = $v{"hits"} + $v{"miss"};
292*d0054224SAdam Stevko	$v{"hit%"} = 100 * ($v{"hits"} / $v{"read"}) if $v{"read"} > 0;
293*d0054224SAdam Stevko	$v{"miss%"} = 100 - $v{"hit%"} if $v{"read"} > 0;
294*d0054224SAdam Stevko
295*d0054224SAdam Stevko	$v{"dhit"} = ($d{"demand_data_hits"} +
296*d0054224SAdam Stevko	    $d{"demand_metadata_hits"})/$int;
297*d0054224SAdam Stevko	$v{"dmis"} = ($d{"demand_data_misses"} +
298*d0054224SAdam Stevko	    $d{"demand_metadata_misses"})/$int;
299*d0054224SAdam Stevko
300*d0054224SAdam Stevko	$v{"dread"} = $v{"dhit"} + $v{"dmis"};
301*d0054224SAdam Stevko	$v{"dh%"} = 100 * ($v{"dhit"} / $v{"dread"}) if $v{"dread"} > 0;
302*d0054224SAdam Stevko	$v{"dm%"} = 100 - $v{"dh%"} if $v{"dread"} > 0;
303*d0054224SAdam Stevko
304*d0054224SAdam Stevko	$v{"phit"} = ($d{"prefetch_data_hits"} +
305*d0054224SAdam Stevko	    $d{"prefetch_metadata_hits"})/$int;
306*d0054224SAdam Stevko	$v{"pmis"} = ($d{"prefetch_data_misses"} +
307*d0054224SAdam Stevko	    $d{"prefetch_metadata_misses"})/$int;
308*d0054224SAdam Stevko
309*d0054224SAdam Stevko	$v{"pread"} = $v{"phit"} + $v{"pmis"};
310*d0054224SAdam Stevko	$v{"ph%"} = 100 * ($v{"phit"} / $v{"pread"}) if $v{"pread"} > 0;
311*d0054224SAdam Stevko	$v{"pm%"} = 100 - $v{"ph%"} if $v{"pread"} > 0;
312*d0054224SAdam Stevko
313*d0054224SAdam Stevko	$v{"mhit"} = ($d{"prefetch_metadata_hits"} +
314*d0054224SAdam Stevko		$d{"demand_metadata_hits"})/$int;
315*d0054224SAdam Stevko	$v{"mmis"} = ($d{"prefetch_metadata_misses"} +
316*d0054224SAdam Stevko	    $d{"demand_metadata_misses"})/$int;
317*d0054224SAdam Stevko
318*d0054224SAdam Stevko	$v{"mread"} = $v{"mhit"} + $v{"mmis"};
319*d0054224SAdam Stevko	$v{"mh%"} = 100 * ($v{"mhit"} / $v{"mread"}) if $v{"mread"} > 0;
320*d0054224SAdam Stevko	$v{"mm%"} = 100 - $v{"mh%"} if $v{"mread"} > 0;
321*d0054224SAdam Stevko
322*d0054224SAdam Stevko	$v{"arcsz"} = $cur{"size"};
323*d0054224SAdam Stevko	$v{"c"} = $cur{"c"};
324*d0054224SAdam Stevko	$v{"mfu"} = $d{"mfu_hits"}/$int;
325*d0054224SAdam Stevko	$v{"mru"} = $d{"mru_hits"}/$int;
326*d0054224SAdam Stevko	$v{"mrug"} = $d{"mru_ghost_hits"}/$int;
327*d0054224SAdam Stevko	$v{"mfug"} = $d{"mfu_ghost_hits"}/$int;
328*d0054224SAdam Stevko	$v{"eskip"} = $d{"evict_skip"}/$int;
329*d0054224SAdam Stevko	$v{"rmiss"} = $d{"recycle_miss"}/$int;
330*d0054224SAdam Stevko	$v{"mtxmis"} = $d{"mutex_miss"}/$int;
331*d0054224SAdam Stevko
332*d0054224SAdam Stevko	if ($l2exist) {
333*d0054224SAdam Stevko		$v{"l2hits"} = $d{"l2_hits"}/$int;
334*d0054224SAdam Stevko		$v{"l2miss"} = $d{"l2_misses"}/$int;
335*d0054224SAdam Stevko		$v{"l2read"} = $v{"l2hits"} + $v{"l2miss"};
336*d0054224SAdam Stevko		$v{"l2hit%"} = 100 * ($v{"l2hits"} / $v{"l2read"})
337*d0054224SAdam Stevko		    if $v{"l2read"} > 0;
338*d0054224SAdam Stevko
339*d0054224SAdam Stevko		$v{"l2miss%"} = 100 - $v{"l2hit%"} if $v{"l2read"} > 0;
340*d0054224SAdam Stevko		$v{"l2size"} = $cur{"l2_size"};
341*d0054224SAdam Stevko		$v{"l2asize"} = $cur{"l2_asize"};
342*d0054224SAdam Stevko		$v{"l2bytes"} = $d{"l2_read_bytes"}/$int;
343*d0054224SAdam Stevko	}
344*d0054224SAdam Stevko}
345*d0054224SAdam Stevko
346*d0054224SAdam Stevkosub main {
347*d0054224SAdam Stevko	my $i = 0;
348*d0054224SAdam Stevko	my $count_flag = 0;
349*d0054224SAdam Stevko
350*d0054224SAdam Stevko	init();
351*d0054224SAdam Stevko	if ($count > 0) { $count_flag = 1; }
352*d0054224SAdam Stevko	while (1) {
353*d0054224SAdam Stevko		print_header() if ($i == 0);
354*d0054224SAdam Stevko		snap_stats();
355*d0054224SAdam Stevko		calculate();
356*d0054224SAdam Stevko		print_values();
357*d0054224SAdam Stevko		last if ($count_flag == 1 && $count-- <= 1);
358*d0054224SAdam Stevko		$i = (($i == $hdr_intr) && (not $raw_output)) ? 0 : $i+1;
359*d0054224SAdam Stevko		sleep($int);
360*d0054224SAdam Stevko	}
361*d0054224SAdam Stevko	close($out) if defined $out;
362*d0054224SAdam Stevko}
363*d0054224SAdam Stevko
364*d0054224SAdam Stevko&main;
365