1#!/usr/sbin/dtrace -Zs 2/* 3 * tcl_stat.d - Tcl operation stats using DTrace. 4 * Written for the Tcl DTrace provider. 5 * 6 * $Id: tcl_stat.d 63 2007-10-04 04:34:38Z brendan $ 7 * 8 * This traces activity from all Tcl processes on the system with DTrace 9 * provider support (tcl8.4.16). 10 * 11 * USAGE: tcl_stat.d [interval [count]] 12 * 13 * FIELDS: 14 * EXEC/s Tcl programs executed per second, including 15 * those without Tcl provider support 16 * PROC/s Procedures called, per second 17 * CMD/s Commands created, per second 18 * OBJNEW/s Objects created, per second 19 * OBJFRE/s Objects freed, per second 20 * OP/s Bytecode operations, per second 21 * 22 * The numbers are counts for the interval specified. The default interval 23 * is 1 second. 24 * 25 * If you see a count in "EXECS" but not in the other columns, then you 26 * may have older Tcl software that does not have the integrated DTrace 27 * provider (or newer software where the provider has changed). 28 * 29 * COPYRIGHT: Copyright (c) 2007 Brendan Gregg. 30 * 31 * CDDL HEADER START 32 * 33 * The contents of this file are subject to the terms of the 34 * Common Development and Distribution License, Version 1.0 only 35 * (the "License"). You may not use this file except in compliance 36 * with the License. 37 * 38 * You can obtain a copy of the license at Docs/cddl1.txt 39 * or http://www.opensolaris.org/os/licensing. 40 * See the License for the specific language governing permissions 41 * and limitations under the License. 42 * 43 * CDDL HEADER END 44 * 45 * 09-Sep-2007 Brendan Gregg Created this. 46 */ 47 48#pragma D option quiet 49#pragma D option defaultargs 50 51inline int SCREEN = 21; 52 53dtrace:::BEGIN 54{ 55 execs = procs = cmds = objnew = objfree = ops = 0; 56 lines = SCREEN + 1; 57 interval = $1 ? $1 : 1; 58 counts = $2 ? $2 : -1; 59 secs = interval; 60 first = 1; 61} 62 63profile:::tick-1sec 64{ 65 secs--; 66} 67 68/* 69 * Print Header 70 */ 71dtrace:::BEGIN, 72profile:::tick-1sec 73/first || (secs == 0 && lines > SCREEN)/ 74{ 75 printf("%-20s %6s %8s %8s %8s %8s %8s\n", "TIME", "EXEC/s", 76 "PROC/s", "CMD/s", "OBJNEW/s", "OBJFRE/s", "OP/s"); 77 lines = 0; 78 first = 0; 79} 80 81/* 82 * Tally Data 83 */ 84proc:::exec-success 85/execname == "tcl" || execname == "tclsh"/ 86{ 87 execs++; 88} 89 90tcl*:::proc-entry 91{ 92 procs++; 93} 94 95tcl*:::cmd-entry 96{ 97 cmds++; 98} 99 100tcl*:::obj-create 101{ 102 objnew++; 103} 104 105tcl*:::obj-free 106{ 107 objfree++; 108} 109 110tcl*:::inst-start 111{ 112 ops++; 113} 114 115/* 116 * Print Output 117 */ 118profile:::tick-1sec 119/secs == 0/ 120{ 121 printf("%-20Y %6d %8d %8d %8d %8d %8d\n", walltimestamp, 122 execs / interval, procs / interval, cmds / interval, 123 objnew / interval, objfree / interval, ops / interval); 124 execs = procs = cmds = objnew = objfree = ops = 0; 125 secs = interval; 126 lines++; 127 counts--; 128} 129 130/* 131 * End 132 */ 133profile:::tick-1sec 134/counts == 0/ 135{ 136 exit(0); 137} 138