117 lines
2.7 KiB
Bash
Executable File
117 lines
2.7 KiB
Bash
Executable File
#!/usr/bin/sh
|
|
#
|
|
# fddist - file descriptor usage distributions.
|
|
# Written using DTrace (Solaris 10 3/05).
|
|
#
|
|
# This prints distributions for read and write events by file descriptor,
|
|
# by process. This can be used to determine which file descriptor a
|
|
# process is doing the most I/O with.
|
|
#
|
|
# $Id: fddist 3 2007-08-01 10:50:08Z brendan $
|
|
#
|
|
# USAGE: fddist [-r|-w] # hit Ctrl-C to end sample
|
|
#
|
|
# FIELDS:
|
|
# EXEC process name
|
|
# PID process ID
|
|
# value file descriptor
|
|
# count number of events
|
|
#
|
|
# BASED ON: /usr/demo/dtrace/lquantize.d
|
|
#
|
|
# SEE ALSO:
|
|
# DTrace Guide "Aggregations" chapter (docs.sun.com)
|
|
#
|
|
# 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
|
|
#
|
|
# 09-Jun-2005 Brendan Gregg Created this.
|
|
# 20-Apr-2006 " " Last update.
|
|
|
|
|
|
##############################
|
|
# --- Process Arguments ---
|
|
#
|
|
|
|
### Default variables
|
|
opt_read=0; opt_write=0
|
|
|
|
### Process options
|
|
while getopts hrw name
|
|
do
|
|
case $name in
|
|
r) opt_read=1 ;;
|
|
w) opt_write=1 ;;
|
|
h|?) cat <<-END >&2
|
|
USAGE: fddist [-r|-w]
|
|
-r # reads only
|
|
-w # writes only
|
|
eg,
|
|
fddist # default, r+w counts
|
|
fddist -r # read count only
|
|
END
|
|
exit 1
|
|
esac
|
|
done
|
|
shift `expr $OPTIND - 1`
|
|
|
|
### Option logic
|
|
if [ $opt_read -eq 0 -a $opt_write -eq 0 ]; then
|
|
opt_read=1; opt_write=1
|
|
fi
|
|
|
|
|
|
#################################
|
|
# --- Main Program, DTrace ---
|
|
#
|
|
/usr/sbin/dtrace -n '
|
|
#pragma D option quiet
|
|
|
|
inline int OPT_read = '$opt_read';
|
|
inline int OPT_write = '$opt_write';
|
|
inline int FDMAX = 255;
|
|
|
|
/* print header */
|
|
dtrace:::BEGIN
|
|
{
|
|
printf("Tracing ");
|
|
OPT_read && OPT_write ? printf("reads and writes") : 1;
|
|
OPT_read && ! OPT_write ? printf("reads") : 1;
|
|
! OPT_read && OPT_write ? printf("writes") : 1;
|
|
printf("... Hit Ctrl-C to end.\n");
|
|
}
|
|
|
|
/* sample reads */
|
|
syscall::*read*:entry
|
|
/OPT_read/
|
|
{
|
|
@Count[execname, pid] = lquantize(arg0, 0, FDMAX, 1);
|
|
}
|
|
|
|
/* sample writes */
|
|
syscall::*write*:entry
|
|
/OPT_write/
|
|
{
|
|
@Count[execname, pid] = lquantize(arg0, 0, FDMAX, 1);
|
|
}
|
|
|
|
/* print report */
|
|
dtrace:::END
|
|
{
|
|
printa("EXEC: %-16s PID: %d\n%@d\n",@Count);
|
|
}
|
|
'
|