xref: /netbsd-src/external/cddl/dtracetoolkit/dist/Kernel/dnlcstat (revision c29d51755812ace2e87aeefdb06cb2b4dac7087a)
1*c29d5175Schristos#!/usr/bin/sh
2*c29d5175Schristos#
3*c29d5175Schristos# dnlcstat - DNLC statistics.
4*c29d5175Schristos#            Written in DTrace (Solaris 10 3/05).
5*c29d5175Schristos#
6*c29d5175Schristos# The DNLC is the Directory Name Lookup Cache. Filename lookups often
7*c29d5175Schristos# return a hit from here, before needing to traverse the regular file
8*c29d5175Schristos# system cache or go to disk.
9*c29d5175Schristos#
10*c29d5175Schristos# $Id: dnlcstat,v 1.1.1.1 2015/09/30 22:01:09 christos Exp $
11*c29d5175Schristos#
12*c29d5175Schristos# USAGE:	dnlcstat [interval [count]]
13*c29d5175Schristos#
14*c29d5175Schristos# FIELDS:
15*c29d5175Schristos#
16*c29d5175Schristos#		%hit	hit percentage for this sample
17*c29d5175Schristos#		hit	number of DNLC hits in this sample
18*c29d5175Schristos#		miss	number of DNLC misses in this sample
19*c29d5175Schristos#
20*c29d5175Schristos# SEE ALSO: 	CacheKit, http://www.brendangregg.com/cachekit.html
21*c29d5175Schristos#		(contains a dnlcstat written in Perl, which uses less CPU)
22*c29d5175Schristos#
23*c29d5175Schristos# COPYRIGHT: Copyright (c) 2005 Brendan Gregg.
24*c29d5175Schristos#
25*c29d5175Schristos# CDDL HEADER START
26*c29d5175Schristos#
27*c29d5175Schristos#  The contents of this file are subject to the terms of the
28*c29d5175Schristos#  Common Development and Distribution License, Version 1.0 only
29*c29d5175Schristos#  (the "License").  You may not use this file except in compliance
30*c29d5175Schristos#  with the License.
31*c29d5175Schristos#
32*c29d5175Schristos#  You can obtain a copy of the license at Docs/cddl1.txt
33*c29d5175Schristos#  or http://www.opensolaris.org/os/licensing.
34*c29d5175Schristos#  See the License for the specific language governing permissions
35*c29d5175Schristos#  and limitations under the License.
36*c29d5175Schristos#
37*c29d5175Schristos# CDDL HEADER END
38*c29d5175Schristos#
39*c29d5175Schristos# 27-Mar-2004	Brendan Gregg	Created this.
40*c29d5175Schristos# 14-Jun-2005	   "      "  	Updated style.
41*c29d5175Schristos# 14-Jun-2005	   "      "  	Last update.
42*c29d5175Schristos#
43*c29d5175Schristos
44*c29d5175Schristos##############################
45*c29d5175Schristos# --- Process Arguments ---
46*c29d5175Schristos#
47*c29d5175Schristos
48*c29d5175Schristos### default values
49*c29d5175Schristosinterval=1; count=-1
50*c29d5175Schristos
51*c29d5175Schristos### check arguments
52*c29d5175Schristosif [ "$1" = "-h" -o "$1" = "--help" ]; then
53*c29d5175Schristos	cat <<-END >&2
54*c29d5175Schristos	USAGE: dnlcstat [interval [count]]
55*c29d5175Schristos	       dnlcstat          # 1 second samples, infinite
56*c29d5175Schristos	  eg,
57*c29d5175Schristos	       dnlcstat 1        # print every 1 second
58*c29d5175Schristos	       dnlcstat 5 6      # print every 5 seconds, 6 times
59*c29d5175Schristos	END
60*c29d5175Schristos        exit 1
61*c29d5175Schristosfi
62*c29d5175Schristos
63*c29d5175Schristos### argument logic
64*c29d5175Schristosif [ "$1" -gt 0 ]; then
65*c29d5175Schristos        interval=$1; count=-1; shift
66*c29d5175Schristosfi
67*c29d5175Schristosif [ "$1" -gt 0 ]; then
68*c29d5175Schristos        count=$1; shift
69*c29d5175Schristosfi
70*c29d5175Schristosif [ $interval -eq 0 ]; then
71*c29d5175Schristos        interval=1
72*c29d5175Schristosfi
73*c29d5175Schristos
74*c29d5175Schristos
75*c29d5175Schristos#################################
76*c29d5175Schristos# --- Main Program, DTrace ---
77*c29d5175Schristos#
78*c29d5175Schristos/usr/sbin/dtrace -n '
79*c29d5175Schristos #pragma D option quiet
80*c29d5175Schristos
81*c29d5175Schristos /*
82*c29d5175Schristos  * Command line arguments
83*c29d5175Schristos  */
84*c29d5175Schristos inline int INTERVAL   = '$interval';
85*c29d5175Schristos inline int COUNTER    = '$count';
86*c29d5175Schristos inline int SCREEN = 21;
87*c29d5175Schristos
88*c29d5175Schristos int hits;			/* hits */
89*c29d5175Schristos int misses;			/* misses */
90*c29d5175Schristos
91*c29d5175Schristos /*
92*c29d5175Schristos  * Initialise variables
93*c29d5175Schristos  */
94*c29d5175Schristos dtrace:::BEGIN
95*c29d5175Schristos {
96*c29d5175Schristos	lines = SCREEN + 1;
97*c29d5175Schristos	counts = COUNTER;
98*c29d5175Schristos	secs = INTERVAL;
99*c29d5175Schristos	first = 1;
100*c29d5175Schristos }
101*c29d5175Schristos
102*c29d5175Schristos /*
103*c29d5175Schristos  * Print header
104*c29d5175Schristos  */
105*c29d5175Schristos dtrace:::BEGIN,
106*c29d5175Schristos tick-1sec
107*c29d5175Schristos /first || (secs == 0 && lines > SCREEN)/
108*c29d5175Schristos {
109*c29d5175Schristos	printf("%10s %8s %8s\n","dnlc  %hit","hit","miss");
110*c29d5175Schristos	lines = 0;
111*c29d5175Schristos	first = 0;
112*c29d5175Schristos }
113*c29d5175Schristos
114*c29d5175Schristos /*
115*c29d5175Schristos  * Probe DNLC lookups
116*c29d5175Schristos  */
117*c29d5175Schristos fbt:genunix:dnlc_lookup:return
118*c29d5175Schristos {
119*c29d5175Schristos	hits   += arg1 == 0 ? 0 : 1;
120*c29d5175Schristos	misses += arg1 == 0 ? 1 : 0;
121*c29d5175Schristos }
122*c29d5175Schristos
123*c29d5175Schristos profile:::tick-1sec
124*c29d5175Schristos {
125*c29d5175Schristos        secs--;
126*c29d5175Schristos }
127*c29d5175Schristos
128*c29d5175Schristos
129*c29d5175Schristos /*
130*c29d5175Schristos  * Print output line
131*c29d5175Schristos  */
132*c29d5175Schristos profile:::tick-1sec
133*c29d5175Schristos /secs == 0/
134*c29d5175Schristos {
135*c29d5175Schristos	/* calculate hit percent */
136*c29d5175Schristos	this->divide = misses + hits == 0 ? 1 : misses + hits;
137*c29d5175Schristos	ratio = hits * 100 / this->divide;
138*c29d5175Schristos
139*c29d5175Schristos	/* print output */
140*c29d5175Schristos	printf("%10d %8d %8d\n",ratio,hits,misses);
141*c29d5175Schristos
142*c29d5175Schristos	/* clear counters */
143*c29d5175Schristos	hits = 0;
144*c29d5175Schristos	misses = 0;
145*c29d5175Schristos
146*c29d5175Schristos        /* process counts */
147*c29d5175Schristos        secs = INTERVAL;
148*c29d5175Schristos        counts--;
149*c29d5175Schristos        lines++;
150*c29d5175Schristos
151*c29d5175Schristos }
152*c29d5175Schristos
153*c29d5175Schristos /*
154*c29d5175Schristos  * End
155*c29d5175Schristos  */
156*c29d5175Schristos profile:::tick-1sec
157*c29d5175Schristos /counts == 0/
158*c29d5175Schristos {
159*c29d5175Schristos        exit(0);
160*c29d5175Schristos }
161*c29d5175Schristos'
162*c29d5175Schristos
163