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