xref: /netbsd-src/external/cddl/dtracetoolkit/dist/FS/rfsio.d (revision c29d51755812ace2e87aeefdb06cb2b4dac7087a)
1 #!/usr/sbin/dtrace -s
2 /*
3  * rfsio.d - read FS I/O stats, with cache miss rate.
4  *           Written using DTrace (Solaris 10 3/05)
5  *
6  * This script provides statistics on the number of reads and the bytes
7  * read from filesystems (logical), and the number of bytes read from
8  * disk (physical). A summary is printed every five seconds by filesystem.
9  *
10  * A total miss-rate is also provided for the file system cache.
11  *
12  * $Id: rfsio.d,v 1.1.1.1 2015/09/30 22:01:09 christos Exp $
13  *
14  * USAGE:	rfsio.d
15  *
16  * IDEA: Richard McDougall, Solaris Internals 2nd Ed, FS Chapter.
17  *
18  * COPYRIGHT: Copyright (c) 2006 Brendan Gregg.
19  *
20  * CDDL HEADER START
21  *
22  *  The contents of this file are subject to the terms of the
23  *  Common Development and Distribution License, Version 1.0 only
24  *  (the "License").  You may not use this file except in compliance
25  *  with the License.
26  *
27  *  You can obtain a copy of the license at Docs/cddl1.txt
28  *  or http://www.opensolaris.org/os/licensing.
29  *  See the License for the specific language governing permissions
30  *  and limitations under the License.
31  *
32  * CDDL HEADER END
33  *
34  * 19-Mar-2006  Brendan Gregg   Created this.
35  * 23-Apr-2006	   "      "	Last update.
36  */
37 
38 #pragma D option quiet
39 
40 self int trace;
41 uint64_t lbytes;
42 uint64_t pbytes;
43 
44 dtrace:::BEGIN
45 {
46 	trace("Tracing...\n");
47 }
48 
49 fbt::fop_read:entry
50 /self->trace == 0/
51 {
52 	self->fs_mount = args[0]->v_vfsp == `rootvfs ? "/" :
53 	    args[0]->v_vfsp->vfs_vnodecovered ?
54 	    stringof(args[0]->v_vfsp->vfs_vnodecovered->v_path) : NULL;
55 }
56 
57 fbt::fop_read:entry
58 /self->fs_mount != NULL/
59 {
60 	@rio[self->fs_mount, "logical"] = count();
61 	lbytes += args[1]->uio_resid;
62 	self->size = args[1]->uio_resid;
63 	self->uiop = args[1];
64 }
65 
66 fbt::fop_read:return
67 /self->size/
68 {
69 	@rbytes[self->fs_mount, "logical"] =
70 	    sum(self->size - self->uiop->uio_resid);
71 	self->size = 0;
72 	self->uiop = 0;
73 	self->fs_mount = 0;
74 }
75 
76 io::bdev_strategy:start
77 /self->size && args[0]->b_flags & B_READ/
78 {
79 	@rio[self->fs_mount, "physical"] = count();
80 	@rbytes[self->fs_mount, "physical"] = sum(args[0]->b_bcount);
81 	pbytes += args[0]->b_bcount;
82 }
83 
84 profile:::tick-5s
85 {
86 	trunc(@rio, 20);
87 	trunc(@rbytes, 20);
88 	printf("\033[H\033[2J");
89 	printf("\nRead IOPS (count)\n");
90 	printa("%-32s %10s %10@d\n", @rio);
91 	printf("\nRead Bandwidth (bytes)\n");
92 	printa("%-32s %10s %10@d\n", @rbytes);
93 	printf("\nTotal File System miss-rate: %d%%\n",
94 	    lbytes ? 100 * pbytes / lbytes : 0);
95 	trunc(@rbytes);
96 	trunc(@rio);
97 	lbytes = pbytes = 0;
98 }
99