1 #!/usr/bin/sh 2 # 3 # fddist - file descriptor usage distributions. 4 # Written using DTrace (Solaris 10 3/05). 5 # 6 # This prints distributions for read and write events by file descriptor, 7 # by process. This can be used to determine which file descriptor a 8 # process is doing the most I/O with. 9 # 10 # $Id: fddist,v 1.1.1.1 2015/09/30 22:01:07 christos Exp $ 11 # 12 # USAGE: fddist [-r|-w] # hit Ctrl-C to end sample 13 # 14 # FIELDS: 15 # EXEC process name 16 # PID process ID 17 # value file descriptor 18 # count number of events 19 # 20 # BASED ON: /usr/demo/dtrace/lquantize.d 21 # 22 # SEE ALSO: 23 # DTrace Guide "Aggregations" chapter (docs.sun.com) 24 # 25 # PORTIONS: Copyright (c) 2005, 2006 Brendan Gregg. 26 # 27 # CDDL HEADER START 28 # 29 # The contents of this file are subject to the terms of the 30 # Common Development and Distribution License, Version 1.0 only 31 # (the "License"). You may not use this file except in compliance 32 # with the License. 33 # 34 # You can obtain a copy of the license at Docs/cddl1.txt 35 # or http://www.opensolaris.org/os/licensing. 36 # See the License for the specific language governing permissions 37 # and limitations under the License. 38 # 39 # CDDL HEADER END 40 # 41 # 09-Jun-2005 Brendan Gregg Created this. 42 # 20-Apr-2006 " " Last update. 43 44 45 ############################## 46 # --- Process Arguments --- 47 # 48 49 ### Default variables 50 opt_read=0; opt_write=0 51 52 ### Process options 53 while getopts hrw name 54 do 55 case $name in 56 r) opt_read=1 ;; 57 w) opt_write=1 ;; 58 h|?) cat <<-END >&2 59 USAGE: fddist [-r|-w] 60 -r # reads only 61 -w # writes only 62 eg, 63 fddist # default, r+w counts 64 fddist -r # read count only 65 END 66 exit 1 67 esac 68 done 69 shift `expr $OPTIND - 1` 70 71 ### Option logic 72 if [ $opt_read -eq 0 -a $opt_write -eq 0 ]; then 73 opt_read=1; opt_write=1 74 fi 75 76 77 ################################# 78 # --- Main Program, DTrace --- 79 # 80 /usr/sbin/dtrace -n ' 81 #pragma D option quiet 82 83 inline int OPT_read = '$opt_read'; 84 inline int OPT_write = '$opt_write'; 85 inline int FDMAX = 255; 86 87 /* print header */ 88 dtrace:::BEGIN 89 { 90 printf("Tracing "); 91 OPT_read && OPT_write ? printf("reads and writes") : 1; 92 OPT_read && ! OPT_write ? printf("reads") : 1; 93 ! OPT_read && OPT_write ? printf("writes") : 1; 94 printf("... Hit Ctrl-C to end.\n"); 95 } 96 97 /* sample reads */ 98 syscall::*read*:entry 99 /OPT_read/ 100 { 101 @Count[execname, pid] = lquantize(arg0, 0, FDMAX, 1); 102 } 103 104 /* sample writes */ 105 syscall::*write*:entry 106 /OPT_write/ 107 { 108 @Count[execname, pid] = lquantize(arg0, 0, FDMAX, 1); 109 } 110 111 /* print report */ 112 dtrace:::END 113 { 114 printa("EXEC: %-16s PID: %d\n%@d\n",@Count); 115 } 116 ' 117