]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - cddl/contrib/dtracetoolkit/FS/rfsio.d
MFC r368207,368607:
[FreeBSD/stable/10.git] / cddl / contrib / dtracetoolkit / FS / rfsio.d
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 3 2007-08-01 10:50:08Z brendan $
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 }