diff options
Diffstat (limited to 'Proc/sampleproc')
-rwxr-xr-x | Proc/sampleproc | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/Proc/sampleproc b/Proc/sampleproc new file mode 100755 index 000000000000..891be1465094 --- /dev/null +++ b/Proc/sampleproc @@ -0,0 +1,105 @@ +#!/usr/bin/ksh +# +# sampleproc - sample processes on the CPUs. +# Written using DTrace (Solaris 10 3/05). +# +# This program samples which process is on each CPU, at a particular +# configurable rate. This can be used as an estimate for which process +# is consuming the most CPU time. +# +# $Id: sampleproc 8 2007-08-06 05:55:26Z brendan $ +# +# USAGE: sampleproc [hertz] # hit Ctrl-C to end sample +# +# FIELDS: +# PID Process ID +# COMMAND Command name +# COUNT Number of samples +# PERCENT Percent of CPU usage +# +# BASED ON: /usr/demo/dtrace/prof.d +# +# SEE ALSO: +# DTrace Guide "profile Provider" chapter (docs.sun.com) +# +# PORTIONS: 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 +# +# 09-Jun-2005 Brendan Gregg Created this. +# 09-Jul-2005 " " Last update. + +### Usage +function usage +{ + cat <<-END >&2 + USAGE: sampleproc [hertz] + eg, + sampleproc # defaults to 100 hertz + sampleproc 1000 # 1000 hertz + END + exit 1 +} + +### Process arguments +if (( $# == 0 )); then + hertz=100 +elif (( $# == 1 )); then + hertz=$1 + if [[ "$hertz" = *[a-zA-Z]* ]]; then + print "ERROR2: $hertz hertz is invalid." >&2 + exit 2 + fi + if (( hertz > 5000 )); then + print "ERROR3: $hertz hertz is too fast (max 5000)." >&2 + exit 3 + fi + if (( hertz < 1 )); then + print "ERROR4: $hertz hertz is too low (min 1)." >&2 + exit 4 + fi +else + usage +fi + +### Run DTrace +/usr/sbin/dtrace -n ' + #pragma D option quiet + + dtrace:::BEGIN + { + printf("Sampling at %d hertz... Hit Ctrl-C to end.\n",$1); + self->start = timestamp; + } + + profile:::profile-$1 + { + @Proc[pid, execname] = count(); + @BigProc[pid, execname] = sum(1000); /* dont ask */ + } + + dtrace:::END + { + this->end = timestamp; + + printf("%5s %-20s %10s\n", "PID", "CMD", "COUNT"); + printa("%5d %-20s %10@d\n", @Proc); + + normalize(@BigProc, + ((`ncpus_online * $1 * (this->end - self->start))/100000000)); + printf("\n%5s %-20s %10s\n", "PID", "CMD", "PERCENT"); + printa("%5d %-20s %10@d\n", @BigProc); + } +' $hertz |