1dcbf3bd6SGeorge Wilson /* 2dcbf3bd6SGeorge Wilson * This file and its contents are supplied under the terms of the 3dcbf3bd6SGeorge Wilson * Common Development and Distribution License ("CDDL"), version 1.0. 4dcbf3bd6SGeorge Wilson * You may only use this file in accordance with the terms of version 5dcbf3bd6SGeorge Wilson * 1.0 of the CDDL. 6dcbf3bd6SGeorge Wilson * 7dcbf3bd6SGeorge Wilson * A full copy of the text of the CDDL should have accompanied this 8dcbf3bd6SGeorge Wilson * source. A copy of the CDDL is also available via the Internet at 9dcbf3bd6SGeorge Wilson * http://www.illumos.org/license/CDDL. 10dcbf3bd6SGeorge Wilson */ 11dcbf3bd6SGeorge Wilson 12dcbf3bd6SGeorge Wilson /* 13*c373aa8bSJohn Wren Kennedy * Copyright (c) 2013, 2016 by Delphix. All rights reserved. 14dcbf3bd6SGeorge Wilson */ 15dcbf3bd6SGeorge Wilson 16dcbf3bd6SGeorge Wilson /* 17*c373aa8bSJohn Wren Kennedy * This measures the IO operations as seen by the ZPL layer (e.g. 18*c373aa8bSJohn Wren Kennedy * zfs_read and zfs_write), as well as the underlying block layer (e.g. 19*c373aa8bSJohn Wren Kennedy * the "io" dtrace provider). 20*c373aa8bSJohn Wren Kennedy * 21*c373aa8bSJohn Wren Kennedy * time: The number of seconds elapsed since the epoch 22*c373aa8bSJohn Wren Kennedy * @ops: collects the count of each metric (e.g. count of zfs_read calls) 23*c373aa8bSJohn Wren Kennedy * @latencies: collects the latency information of each metric 24*c373aa8bSJohn Wren Kennedy * @histograms: collects histograms of the latency for each metric 25*c373aa8bSJohn Wren Kennedy * @bytes: collects the throughput information for each metric 26dcbf3bd6SGeorge Wilson */ 27dcbf3bd6SGeorge Wilson 28*c373aa8bSJohn Wren Kennedy #include <sys/file.h> 29*c373aa8bSJohn Wren Kennedy #include <sys/fs/zfs.h> 30*c373aa8bSJohn Wren Kennedy 31dcbf3bd6SGeorge Wilson #pragma D option aggsortkey 32dcbf3bd6SGeorge Wilson #pragma D option quiet 33dcbf3bd6SGeorge Wilson 34dcbf3bd6SGeorge Wilson BEGIN 35dcbf3bd6SGeorge Wilson { 36dcbf3bd6SGeorge Wilson @ops["read"] = count(); 37dcbf3bd6SGeorge Wilson @ops["write"] = count(); 38dcbf3bd6SGeorge Wilson @ops["zfs_read"] = count(); 39dcbf3bd6SGeorge Wilson @ops["zfs_write"] = count(); 40*c373aa8bSJohn Wren Kennedy @ops["zfs_write_sync"] = count(); 41*c373aa8bSJohn Wren Kennedy @ops["zfs_write_async"] = count(); 42dcbf3bd6SGeorge Wilson @latencies["read"] = avg(0); 43dcbf3bd6SGeorge Wilson @latencies["write"] = avg(0); 44dcbf3bd6SGeorge Wilson @latencies["zfs_read"] = avg(0); 45dcbf3bd6SGeorge Wilson @latencies["zfs_write"] = avg(0); 46*c373aa8bSJohn Wren Kennedy @latencies["zfs_write_sync"] = avg(0); 47*c373aa8bSJohn Wren Kennedy @latencies["zfs_write_async"] = avg(0); 48*c373aa8bSJohn Wren Kennedy @histograms["read"] = quantize(0); 49*c373aa8bSJohn Wren Kennedy @histograms["write"] = quantize(0); 50*c373aa8bSJohn Wren Kennedy @histograms["zfs_read"] = quantize(0); 51*c373aa8bSJohn Wren Kennedy @histograms["zfs_write"] = quantize(0); 52*c373aa8bSJohn Wren Kennedy @histograms["zfs_write_sync"] = quantize(0); 53*c373aa8bSJohn Wren Kennedy @histograms["zfs_write_async"] = quantize(0); 54dcbf3bd6SGeorge Wilson @bytes["read"] = sum(0); 55dcbf3bd6SGeorge Wilson @bytes["write"] = sum(0); 56dcbf3bd6SGeorge Wilson @bytes["zfs_read"] = sum(0); 57dcbf3bd6SGeorge Wilson @bytes["zfs_write"] = sum(0); 58*c373aa8bSJohn Wren Kennedy @bytes["zfs_write_sync"] = sum(0); 59*c373aa8bSJohn Wren Kennedy @bytes["zfs_write_async"] = sum(0); 60dcbf3bd6SGeorge Wilson clear(@ops); 61dcbf3bd6SGeorge Wilson clear(@latencies); 62*c373aa8bSJohn Wren Kennedy clear(@histograms); 63dcbf3bd6SGeorge Wilson clear(@bytes); 64dcbf3bd6SGeorge Wilson } 65dcbf3bd6SGeorge Wilson 66dcbf3bd6SGeorge Wilson fbt:zfs:zfs_read:entry, 67dcbf3bd6SGeorge Wilson fbt:zfs:zfs_write:entry 68dcbf3bd6SGeorge Wilson { 69dcbf3bd6SGeorge Wilson this->zp = (znode_t *)args[0]->v_data; 70*c373aa8bSJohn Wren Kennedy self->os = this->zp->z_zfsvfs->z_os; 71*c373aa8bSJohn Wren Kennedy self->poolname = stringof(self->os->os_spa->spa_name); 72dcbf3bd6SGeorge Wilson } 73dcbf3bd6SGeorge Wilson 74dcbf3bd6SGeorge Wilson fbt:zfs:zfs_read:entry, 75dcbf3bd6SGeorge Wilson fbt:zfs:zfs_write:entry 76*c373aa8bSJohn Wren Kennedy / self->poolname == $$1 / 77dcbf3bd6SGeorge Wilson { 78*c373aa8bSJohn Wren Kennedy self->zfs_rw = timestamp; 79*c373aa8bSJohn Wren Kennedy self->bytes = args[1]->uio_resid; 80*c373aa8bSJohn Wren Kennedy } 81*c373aa8bSJohn Wren Kennedy 82*c373aa8bSJohn Wren Kennedy fbt:zfs:zfs_write:entry 83*c373aa8bSJohn Wren Kennedy / self->zfs_rw != 0 / 84*c373aa8bSJohn Wren Kennedy { 85*c373aa8bSJohn Wren Kennedy self->flag = self->os->os_sync == ZFS_SYNC_ALWAYS ? "sync" : 86*c373aa8bSJohn Wren Kennedy (args[2] & (FSYNC | FDSYNC)) ? "sync" : "async"; 87*c373aa8bSJohn Wren Kennedy } 88*c373aa8bSJohn Wren Kennedy 89*c373aa8bSJohn Wren Kennedy fbt:zfs:zfs_write:return 90*c373aa8bSJohn Wren Kennedy / self->zfs_rw != 0 / 91*c373aa8bSJohn Wren Kennedy { 92*c373aa8bSJohn Wren Kennedy if (self->flag == "sync") { 93*c373aa8bSJohn Wren Kennedy this->name = "zfs_write_sync" 94*c373aa8bSJohn Wren Kennedy } else { 95*c373aa8bSJohn Wren Kennedy this->name = "zfs_write_async" 96*c373aa8bSJohn Wren Kennedy } 97*c373aa8bSJohn Wren Kennedy 98*c373aa8bSJohn Wren Kennedy @ops[this->name] = count(); 99*c373aa8bSJohn Wren Kennedy @bytes[this->name] = sum(self->bytes); 100*c373aa8bSJohn Wren Kennedy this->elapsed = timestamp - self->zfs_rw; 101*c373aa8bSJohn Wren Kennedy @latencies[this->name] = avg(this->elapsed); 102*c373aa8bSJohn Wren Kennedy @histograms[this->name] = quantize(this->elapsed); 103dcbf3bd6SGeorge Wilson } 104dcbf3bd6SGeorge Wilson 105dcbf3bd6SGeorge Wilson fbt:zfs:zfs_read:return, 106dcbf3bd6SGeorge Wilson fbt:zfs:zfs_write:return 107*c373aa8bSJohn Wren Kennedy / self->zfs_rw != 0 / 108dcbf3bd6SGeorge Wilson { 109*c373aa8bSJohn Wren Kennedy @ops[probefunc] = count(); 110*c373aa8bSJohn Wren Kennedy @bytes[probefunc] = sum(self->bytes); 111*c373aa8bSJohn Wren Kennedy this->elapsed = timestamp - self->zfs_rw; 112*c373aa8bSJohn Wren Kennedy @latencies[probefunc] = avg(this->elapsed); 113*c373aa8bSJohn Wren Kennedy @histograms[probefunc] = quantize(this->elapsed); 114*c373aa8bSJohn Wren Kennedy self->zfs_rw = 0; 115dcbf3bd6SGeorge Wilson } 116dcbf3bd6SGeorge Wilson 117dcbf3bd6SGeorge Wilson io:::start 118dcbf3bd6SGeorge Wilson / strstr($$2, args[1]->dev_statname) != NULL / 119dcbf3bd6SGeorge Wilson { 120dcbf3bd6SGeorge Wilson start[args[0]->b_edev, args[0]->b_blkno] = timestamp; 121dcbf3bd6SGeorge Wilson } 122dcbf3bd6SGeorge Wilson 123dcbf3bd6SGeorge Wilson io:::done 124dcbf3bd6SGeorge Wilson / start[args[0]->b_edev, args[0]->b_blkno] / 125dcbf3bd6SGeorge Wilson { 126dcbf3bd6SGeorge Wilson this->elapsed = timestamp - start[args[0]->b_edev, args[0]->b_blkno]; 127dcbf3bd6SGeorge Wilson this->name = args[0]->b_flags & B_READ ? "read" : "write"; 128dcbf3bd6SGeorge Wilson @ops[this->name] = count(); 129dcbf3bd6SGeorge Wilson @bytes[this->name] = sum(args[0]->b_bcount); 130dcbf3bd6SGeorge Wilson @latencies[this->name] = avg(this->elapsed); 131*c373aa8bSJohn Wren Kennedy @histograms[this->name] = quantize(this->elapsed); 132dcbf3bd6SGeorge Wilson start[args[0]->b_edev, args[0]->b_blkno] = 0; 133dcbf3bd6SGeorge Wilson } 134dcbf3bd6SGeorge Wilson 135dcbf3bd6SGeorge Wilson tick-$3s 136dcbf3bd6SGeorge Wilson { 137dcbf3bd6SGeorge Wilson printf("%u\n", `time); 138dcbf3bd6SGeorge Wilson printa("ops_%-21s%@u\n", @ops); 139dcbf3bd6SGeorge Wilson printa("bytes_%-21s%@u\n", @bytes); 140dcbf3bd6SGeorge Wilson printa("latencies_%-21s%@u\n", @latencies); 141*c373aa8bSJohn Wren Kennedy printa("histograms_%-21s%@u\n", @histograms); 142dcbf3bd6SGeorge Wilson 143dcbf3bd6SGeorge Wilson clear(@ops); 144dcbf3bd6SGeorge Wilson clear(@bytes); 145dcbf3bd6SGeorge Wilson clear(@latencies); 146*c373aa8bSJohn Wren Kennedy clear(@histograms); 147dcbf3bd6SGeorge Wilson } 148dcbf3bd6SGeorge Wilson 149dcbf3bd6SGeorge Wilson ERROR 150dcbf3bd6SGeorge Wilson { 151dcbf3bd6SGeorge Wilson trace(arg1); 152dcbf3bd6SGeorge Wilson trace(arg2); 153dcbf3bd6SGeorge Wilson trace(arg3); 154dcbf3bd6SGeorge Wilson trace(arg4); 155dcbf3bd6SGeorge Wilson trace(arg5); 156dcbf3bd6SGeorge Wilson } 157