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