1267924Srpaulo#!/usr/sbin/dtrace -s
2267924Srpaulo/*
3267924Srpaulo * Copyright (c) 2012 Robert N. M. Watson
4267924Srpaulo * All rights reserved.
5267924Srpaulo *
6267924Srpaulo * This software was developed at the University of Cambridge Computer
7267924Srpaulo * Laboratory with support from a grant from Google, Inc.
8267924Srpaulo *
9267924Srpaulo * Redistribution and use in source and binary forms, with or without
10267924Srpaulo * modification, are permitted provided that the following conditions
11267924Srpaulo * are met:
12267924Srpaulo * 1. Redistributions of source code must retain the above copyright
13267924Srpaulo *    notice, this list of conditions and the following disclaimer.
14267924Srpaulo * 2. Redistributions in binary form must reproduce the above copyright
15267924Srpaulo *    notice, this list of conditions and the following disclaimer in the
16267924Srpaulo *    documentation and/or other materials provided with the distribution.
17267924Srpaulo *
18267924Srpaulo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19267924Srpaulo * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20267924Srpaulo * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21267924Srpaulo * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22267924Srpaulo * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23267924Srpaulo * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24267924Srpaulo * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25267924Srpaulo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26267924Srpaulo * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27267924Srpaulo * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28267924Srpaulo * SUCH DAMAGE.
29267924Srpaulo *
30267924Srpaulo * $FreeBSD$
31267924Srpaulo *
32267924Srpaulo * This script measures all time spent waiting on RPC replies for each
33267924Srpaulo * system call, and then generates a histogram of those times sorted by
34267924Srpaulo * system call name.
35267924Srpaulo *
36267924Srpaulo * Currently only supports NFSv3
37267924Srpaulo *
38267924Srpaulo * Usage: nfsclienttime
39267924Srpaulo *
40267924Srpaulo * Press Ctrl-C to exit and display statistics.
41267924Srpaulo */
42235614Sgnn
43235614Sgnn#pragma D option quiet
44235614Sgnn
45235614Sgnndtrace:::BEGIN
46235614Sgnn{
47235614Sgnn	printf("Collecting data...press Ctrl-C to exit.\n");
48235614Sgnn}
49235614Sgnn
50235614Sgnnsyscall:::entry
51235614Sgnn{
52235614Sgnn
53235614Sgnn        self->count = 0;
54235614Sgnn}
55235614Sgnn
56287544Sgnnnfscl:nfs3::start
57235614Sgnn{
58235614Sgnn
59235614Sgnn        self->timestamp = timestamp;
60235614Sgnn}
61235614Sgnn
62287544Sgnnnfscl:nfs3::done
63235614Sgnn{
64235614Sgnn
65235614Sgnn        self->count += (timestamp - self->timestamp);
66235614Sgnn}
67235614Sgnn
68235614Sgnnsyscall:::return
69235614Sgnn/self->count != 0/  {
70235614Sgnn
71235614Sgnn        @syscalls[probefunc] = quantize(self->count);
72235614Sgnn}
73