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