106 lines
2.4 KiB
Bash
Executable File
106 lines
2.4 KiB
Bash
Executable File
#!/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
|