diff options
Diffstat (limited to 'Disk/diskhits')
-rwxr-xr-x | Disk/diskhits | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/Disk/diskhits b/Disk/diskhits new file mode 100755 index 000000000000..3d72e4ade583 --- /dev/null +++ b/Disk/diskhits @@ -0,0 +1,113 @@ +#!/usr/bin/ksh +# +# diskhits - disk access by file offset. +# Written using DTrace (Solaris 10 3/05). +# +# $Id: diskhits 3 2007-08-01 10:50:08Z brendan $ +# +# This prints how a file was accessed, the locations on a distribution plot. +# This is for the cache misses only - the file activity that resulted in +# disk events. +# +# USAGE: diskhits pathname +# eg, +# diskhits /var/adm/messages +# +# FIELDS: +# Location (KB) The file offset of the disk activity, Kbytes. +# Size (KB) Size of the disk activity, Kbytes. +# Total RW Total disk activity, reads + writes. +# +# BASED ON: /usr/demo/dtrace/applicat.d +# +# SEE ALSO: DTrace Guide "io Provider" chapter (docs.sun.com) +# iosnoop (DTraceToolkit) +# +# PORTIONS: Copyright (c) 2005, 2006 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# 08-Jun-2005 Brendan Gregg Created this. +# 20-Apr-2006 " " Last update. +# + +### Usage +function usage +{ + cat <<-END >&2 + USAGE: diskhits pathname + eg, + diskhits /var/adm/wtmpx + END + exit 1 +} + +### Process arguments +if (( $# != 1 )); then + usage +fi +if [[ $1 == "-h" ]]; then + usage +fi +pathname=$1 +if [[ ! -e $pathname ]]; then + print "ERROR2: file $pathname not found" >&2 + exit 2 +fi + +### Calculate output scale +report_lines=20 +set -- `ls -l $pathname` +filesize=$5 +(( file_kb_max = filesize / 1024 )) +(( scale_kb = filesize / (1024 * report_lines) )) +if (( file_kb_max < 20 )); then file_kb_max=20; fi +if (( scale_kb < 1 )); then scale_kb=1; fi + +# +# Run DTrace +# +/usr/sbin/dtrace -n ' + #pragma D option quiet + + inline string PATHNAME = "'$pathname'"; + inline int FILE_KB_MAX = '$file_kb_max'; + inline int SCALE_KB = '$scale_kb'; + + dtrace:::BEGIN + { + printf("Tracing... Hit Ctrl-C to end.\n"); + } + + io:::start + /args[2]->fi_pathname == PATHNAME/ + { + this->kb = args[2]->fi_offset == -1 ? -1 : args[2]->fi_offset / 1024; + @Location = lquantize(this->kb, 0, FILE_KB_MAX, SCALE_KB); + @Size = quantize(args[0]->b_bcount/1024); + @Total = sum(args[0]->b_bcount/1024); + } + + dtrace:::END + { + printf("Location (KB),"); + printa(@Location); + + printf("Size (KB),"); + printa(@Size); + + printa("Total RW: %@d KB\n", @Total); + } +' |