1 #!/usr/bin/ksh 2 # 3 # diskhits - disk access by file offset. 4 # Written using DTrace (Solaris 10 3/05). 5 # 6 # $Id: diskhits,v 1.1.1.1 2015/09/30 22:01:07 christos Exp $ 7 # 8 # This prints how a file was accessed, the locations on a distribution plot. 9 # This is for the cache misses only - the file activity that resulted in 10 # disk events. 11 # 12 # USAGE: diskhits pathname 13 # eg, 14 # diskhits /var/adm/messages 15 # 16 # FIELDS: 17 # Location (KB) The file offset of the disk activity, Kbytes. 18 # Size (KB) Size of the disk activity, Kbytes. 19 # Total RW Total disk activity, reads + writes. 20 # 21 # BASED ON: /usr/demo/dtrace/applicat.d 22 # 23 # SEE ALSO: DTrace Guide "io Provider" chapter (docs.sun.com) 24 # iosnoop (DTraceToolkit) 25 # 26 # PORTIONS: Copyright (c) 2005, 2006 Brendan Gregg. 27 # 28 # CDDL HEADER START 29 # 30 # The contents of this file are subject to the terms of the 31 # Common Development and Distribution License, Version 1.0 only 32 # (the "License"). You may not use this file except in compliance 33 # with the License. 34 # 35 # You can obtain a copy of the license at Docs/cddl1.txt 36 # or http://www.opensolaris.org/os/licensing. 37 # See the License for the specific language governing permissions 38 # and limitations under the License. 39 # 40 # CDDL HEADER END 41 # 42 # 08-Jun-2005 Brendan Gregg Created this. 43 # 20-Apr-2006 " " Last update. 44 # 45 46 ### Usage 47 function usage 48 { 49 cat <<-END >&2 50 USAGE: diskhits pathname 51 eg, 52 diskhits /var/adm/wtmpx 53 END 54 exit 1 55 } 56 57 ### Process arguments 58 if (( $# != 1 )); then 59 usage 60 fi 61 if [[ $1 == "-h" ]]; then 62 usage 63 fi 64 pathname=$1 65 if [[ ! -e $pathname ]]; then 66 print "ERROR2: file $pathname not found" >&2 67 exit 2 68 fi 69 70 ### Calculate output scale 71 report_lines=20 72 set -- `ls -l $pathname` 73 filesize=$5 74 (( file_kb_max = filesize / 1024 )) 75 (( scale_kb = filesize / (1024 * report_lines) )) 76 if (( file_kb_max < 20 )); then file_kb_max=20; fi 77 if (( scale_kb < 1 )); then scale_kb=1; fi 78 79 # 80 # Run DTrace 81 # 82 /usr/sbin/dtrace -n ' 83 #pragma D option quiet 84 85 inline string PATHNAME = "'$pathname'"; 86 inline int FILE_KB_MAX = '$file_kb_max'; 87 inline int SCALE_KB = '$scale_kb'; 88 89 dtrace:::BEGIN 90 { 91 printf("Tracing... Hit Ctrl-C to end.\n"); 92 } 93 94 io:::start 95 /args[2]->fi_pathname == PATHNAME/ 96 { 97 this->kb = args[2]->fi_offset == -1 ? -1 : args[2]->fi_offset / 1024; 98 @Location = lquantize(this->kb, 0, FILE_KB_MAX, SCALE_KB); 99 @Size = quantize(args[0]->b_bcount/1024); 100 @Total = sum(args[0]->b_bcount/1024); 101 } 102 103 dtrace:::END 104 { 105 printf("Location (KB),"); 106 printa(@Location); 107 108 printf("Size (KB),"); 109 printa(@Size); 110 111 printa("Total RW: %@d KB\n", @Total); 112 } 113 ' 114