1*19e252baSAlexander Leidinger #!/usr/sbin/dtrace -qs 2*19e252baSAlexander Leidinger 3*19e252baSAlexander Leidinger /*- 4*19e252baSAlexander Leidinger * Copyright (c) 2008-2012 Alexander Leidinger <netchild@FreeBSD.org> 5*19e252baSAlexander Leidinger * All rights reserved. 6*19e252baSAlexander Leidinger * 7*19e252baSAlexander Leidinger * Redistribution and use in source and binary forms, with or without 8*19e252baSAlexander Leidinger * modification, are permitted provided that the following conditions 9*19e252baSAlexander Leidinger * are met: 10*19e252baSAlexander Leidinger * 1. Redistributions of source code must retain the above copyright 11*19e252baSAlexander Leidinger * notice, this list of conditions and the following disclaimer 12*19e252baSAlexander Leidinger * in this position and unchanged. 13*19e252baSAlexander Leidinger * 2. Redistributions in binary form must reproduce the above copyright 14*19e252baSAlexander Leidinger * notice, this list of conditions and the following disclaimer in the 15*19e252baSAlexander Leidinger * documentation and/or other materials provided with the distribution. 16*19e252baSAlexander Leidinger * 17*19e252baSAlexander Leidinger * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18*19e252baSAlexander Leidinger * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19*19e252baSAlexander Leidinger * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20*19e252baSAlexander Leidinger * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21*19e252baSAlexander Leidinger * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22*19e252baSAlexander Leidinger * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23*19e252baSAlexander Leidinger * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24*19e252baSAlexander Leidinger * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25*19e252baSAlexander Leidinger * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26*19e252baSAlexander Leidinger * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27*19e252baSAlexander Leidinger */ 28*19e252baSAlexander Leidinger 29*19e252baSAlexander Leidinger /** 30*19e252baSAlexander Leidinger * Some statistics (all per provider): 31*19e252baSAlexander Leidinger * - number of calls to a function per executable binary (not per PID!) 32*19e252baSAlexander Leidinger * - allows to see where an optimization would be beneficial for a given 33*19e252baSAlexander Leidinger * application 34*19e252baSAlexander Leidinger * - graph of CPU time spend in functions per executable binary 35*19e252baSAlexander Leidinger * - together with the number of calls to this function this allows 36*19e252baSAlexander Leidinger * to determine if a kernel optimization would be beneficial / is 37*19e252baSAlexander Leidinger * possible for a given application 38*19e252baSAlexander Leidinger * - graph of longest running (CPU-time!) function in total 39*19e252baSAlexander Leidinger * - may help finding problem cases in the kernel code 40*19e252baSAlexander Leidinger * - graph of longest held (CPU-time!) locks 41*19e252baSAlexander Leidinger */ 42*19e252baSAlexander Leidinger 43*19e252baSAlexander Leidinger #pragma D option dynvarsize=32m 44*19e252baSAlexander Leidinger 45*19e252baSAlexander Leidinger linuxulator*:::entry 46*19e252baSAlexander Leidinger { 47*19e252baSAlexander Leidinger self->time[probefunc] = vtimestamp; 48*19e252baSAlexander Leidinger @calls[probeprov, execname, probefunc] = count(); 49*19e252baSAlexander Leidinger } 50*19e252baSAlexander Leidinger 51*19e252baSAlexander Leidinger linuxulator*:::return 52*19e252baSAlexander Leidinger /self->time[probefunc] != 0/ 53*19e252baSAlexander Leidinger { 54*19e252baSAlexander Leidinger this->timediff = self->time[probefunc] - vtimestamp; 55*19e252baSAlexander Leidinger 56*19e252baSAlexander Leidinger @stats[probeprov, execname, probefunc] = quantize(this->timediff); 57*19e252baSAlexander Leidinger @longest[probeprov, probefunc] = max(this->timediff); 58*19e252baSAlexander Leidinger 59*19e252baSAlexander Leidinger self->time[probefunc] = 0; 60*19e252baSAlexander Leidinger } 61*19e252baSAlexander Leidinger 62*19e252baSAlexander Leidinger linuxulator*:::locked 63*19e252baSAlexander Leidinger { 64*19e252baSAlexander Leidinger self->lock[arg0] = vtimestamp; 65*19e252baSAlexander Leidinger } 66*19e252baSAlexander Leidinger 67*19e252baSAlexander Leidinger linuxulator*:::unlock 68*19e252baSAlexander Leidinger /self->lock[arg0] != 0/ 69*19e252baSAlexander Leidinger { 70*19e252baSAlexander Leidinger this->timediff = self->lock[arg0] - vtimestamp; 71*19e252baSAlexander Leidinger 72*19e252baSAlexander Leidinger @lockstats[probefunc] = quantize(this->timediff); 73*19e252baSAlexander Leidinger @longlock[probefunc] = max(this->timediff); 74*19e252baSAlexander Leidinger 75*19e252baSAlexander Leidinger self->lock[arg0] = 0; 76*19e252baSAlexander Leidinger } 77*19e252baSAlexander Leidinger 78*19e252baSAlexander Leidinger END 79*19e252baSAlexander Leidinger { 80*19e252baSAlexander Leidinger printf("Number of calls per provider/application/kernel function:"); 81*19e252baSAlexander Leidinger printa(@calls); 82*19e252baSAlexander Leidinger printf("CPU-timing statistics per provider/application/kernel function (in ns):"); 83*19e252baSAlexander Leidinger printa(@stats); 84*19e252baSAlexander Leidinger printf("Longest running (CPU-time!) functions per provider (in ns):"); 85*19e252baSAlexander Leidinger printa(@longest); 86*19e252baSAlexander Leidinger printf("Lock CPU-timing statistics:"); 87*19e252baSAlexander Leidinger printa(@lockstats); 88*19e252baSAlexander Leidinger printf("Longest running (CPU-time!) locks:"); 89*19e252baSAlexander Leidinger printa(@longlock); 90*19e252baSAlexander Leidinger } 91*19e252baSAlexander Leidinger 92