diff options
Diffstat (limited to 'cddl/contrib/dtracetoolkit/Kernel/cputimes')
-rwxr-xr-x | cddl/contrib/dtracetoolkit/Kernel/cputimes | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/cddl/contrib/dtracetoolkit/Kernel/cputimes b/cddl/contrib/dtracetoolkit/Kernel/cputimes new file mode 100755 index 0000000..881bf90 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Kernel/cputimes @@ -0,0 +1,203 @@ +#!/usr/bin/sh +# +# cputimes - print CPU time consumed by Kernel/Idle/Processes. +# Written using DTrace (Solaris 10 3/05). +# +# $Id: cputimes 3 2007-08-01 10:50:08Z brendan $ +# +# This program accurately measures time consumed by the kernel, but in +# doing so creates extra kernel load of it's own. The extra kernel +# activity can be measured by running one cputimes and then another, and +# comparing the difference in kernel consumed time. This method can be +# used to estimate the load created by other DTrace scripts. +# +# USAGE: cputimes [-ahTV] [-t top] [interval [count]] +# +# -a # print all processes +# -T # print totals +# -V # don't print timestamps +# -t num # print top num lines only +# eg, +# cputimes 1 # print every 1 second +# cputimes -a 10 # print all processes every 10 secs +# cputimes -at 8 5 # print top 8 lines every 5 secs +# +# +# FIELDS: +# THREADS The following or the process name, +# IDLE Idle time - CPU running idle thread +# KERNEL Kernel time - Kernel servicing interrupts, ... +# PROCESS Process time - PIDs running on the system +# TIME (ns) Sum of the CPU time, ns (nanoseconds) +# +# NOTES: +# * This takes into account multiple CPU servers, the total +# seconds consumed will be a multiple of the CPU count and interval. +# +# SEE ALSO: cpudists +# Heisenberg's uncertainty principle. +# +# COPYRIGHT: Copyright (c) 2005 Brendan Gregg. +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License, Version 1.0 only +# (the "License"). You may not use this file except in compliance +# with the License. +# +# You can obtain a copy of the license at Docs/cddl1.txt +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# CDDL HEADER END +# +# Author: Brendan Gregg [Sydney, Australia] +# +# 27-Apr-2005 Brendan Gregg Created this. +# 22-Sep-2005 " " Fixed a key corruption bug. +# 22-Sep-2005 " " Last update. +# + + +############################## +# --- Process Arguments --- +# +opt_all=0; opt_time=1; opt_top=0; opt_totals=0 +top=0; interval=1; count=1 + +while getopts aht:TV name +do + case $name in + a) opt_all=1 ;; + T) opt_totals=1 ;; + V) opt_time=0 ;; + t) opt_top=1; top=$OPTARG ;; + h|?) cat <<-END >&2 + USAGE: cputimes [-ahTV] [-t top] [interval [count]] + cputimes # default output + -a # print all processes + -T # print totals + -V # don't print times + -t num # print top num lines only + eg, + cputimes 1 # print every 1 second + cputimes -a 10 # all processes per 10 sec + cputimes -at 8 5 # top 8 lines every 5 secs + END + exit 1 + esac +done +shift `expr $OPTIND - 1` + +if [ "$1" -gt 0 ]; then + interval=$1; count=-1; shift +fi +if [ "$1" -gt 0 ]; then + count=$1; shift +fi + + +################################# +# --- Main Program, DTrace --- +# +/usr/sbin/dtrace -n ' + #pragma D option quiet + + /* + * Command line arguments + */ + inline int OPT_all = '$opt_all'; + inline int OPT_time = '$opt_time'; + inline int OPT_totals = '$opt_totals'; + inline int OPT_top = '$opt_top'; + inline int TOP = '$top'; + inline int INTERVAL = '$interval'; + inline int COUNTER = '$count'; + + /* Initialise variables */ + dtrace:::BEGIN + { + cpustart[cpu] = 0; + counts = COUNTER; + secs = INTERVAL; + } + + /* Flag this thread as idle */ + sysinfo:unix:idle_enter:idlethread + { + idle[cpu] = 1; + } + + /* Save kernel time between running threads */ + sched:::on-cpu + /cpustart[cpu]/ + { + this->elapsed = timestamp - cpustart[cpu]; + @Procs["KERNEL"] = sum(this->elapsed); + } + + /* Save the elapsed time of a thread */ + sched:::off-cpu, + sched:::remain-cpu, + profile:::profile-1sec + /cpustart[cpu]/ + { + /* determine the name for this thread */ + program[cpu] = pid == 0 ? idle[cpu] ? "IDLE" : "KERNEL" : + OPT_all ? execname : "PROCESS"; + + /* save elapsed */ + this->elapsed = timestamp - cpustart[cpu]; + @Procs[program[cpu]] = sum(this->elapsed); + cpustart[cpu] = timestamp; + } + + /* Record the start time of a thread */ + sched:::on-cpu, + sched:::remain-cpu + { + idle[cpu] = 0; + cpustart[cpu] = timestamp; + } + + + profile:::tick-1sec + { + secs--; + } + + /* Print time */ + profile:::tick-1sec + /secs == 0/ + { + OPT_time ? printf("%Y,\n", walltimestamp) : 1; + printf("%16s %16s\n", "THREADS", "TIME (ns)"); + } + + /* Print report */ + profile:::tick-1sec + /secs == 0/ + { + OPT_top ? trunc(@Procs, TOP) : 1; + printa("%16s %@16d\n", @Procs); + trunc(@Procs); + secs = INTERVAL; + counts--; + } + + /* End of program */ + profile:::tick-1sec + /counts == 0/ + { + exit(0); + } + + /* cleanup for Ctrl-C */ + dtrace:::END + { + trunc(@Procs); + } +' + |