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 40self int trace; 41uint64_t lbytes; 42uint64_t pbytes; 43 44dtrace:::BEGIN 45{ 46 trace("Tracing...\n"); 47} 48 49fbt::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 57fbt::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 66fbt::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 76io::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 84profile:::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