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