diff options
Diffstat (limited to 'cddl/contrib/dtracetoolkit/Proc/topsysproc')
-rwxr-xr-x | cddl/contrib/dtracetoolkit/Proc/topsysproc | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/cddl/contrib/dtracetoolkit/Proc/topsysproc b/cddl/contrib/dtracetoolkit/Proc/topsysproc new file mode 100755 index 0000000..5836f68 --- /dev/null +++ b/cddl/contrib/dtracetoolkit/Proc/topsysproc @@ -0,0 +1,121 @@ +#!/usr/bin/sh +# +# topsysproc - display top syscalls by process name. +# Written using DTrace (Solaris 10 3/05). +# +# This program continually prints a report of the number of system calls +# by process name, and refreshes the display every 1 second or as specified +# at the command line. Similar data can be fetched with "prstat -m". +# +# $Id: topsysproc 19 2007-09-12 07:47:59Z brendan $ +# +# USAGE: topsysproc [interval] +# +# FIELDS: +# load avg load averages, see uptime(1) +# syscalls total number of syscalls in this interval +# PROCESS process name +# COUNT number of occurances in this interval +# +# NOTE: There may be several PIDs with the same process name. +# +# SEE ALSO: prstat(1M) +# +# INSPIRATION: top(1) by William LeFebvre +# +# 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 +# +# 13-Jun-2005 Brendan Gregg Created this. +# 20-Apr-2006 " " Last update. +# + +# +# Check options +# +if [ "$1" = "-h" -o "$1" = "--help" ]; then + cat <<-END + USAGE: topsysproc [interval] + eg, + topsysproc # default, 1 second updates + topsysproc 5 # 5 second updates + END + exit 1 +fi +interval=1 +if [ "$1" -gt 0 ]; then + interval=$1 +fi + +# +# Run DTrace +# +/usr/sbin/dtrace -n ' + #pragma D option quiet + #pragma D option destructive + + /* constants */ + inline int INTERVAL = '$interval'; + inline int SCREEN = 20; + + /* variables */ + dtrace:::BEGIN + { + secs = 0; + printf("Tracing... Please wait.\n"); + } + + /* record syscall event */ + syscall:::entry + { + @Name[execname] = count(); + @Total = count(); + } + + /* update screen */ + profile:::tick-1sec + /++secs >= INTERVAL/ + { + /* fetch load averages */ + this->load1a = `hp_avenrun[0] / 65536; + this->load5a = `hp_avenrun[1] / 65536; + this->load15a = `hp_avenrun[2] / 65536; + this->load1b = ((`hp_avenrun[0] % 65536) * 100) / 65536; + this->load5b = ((`hp_avenrun[1] % 65536) * 100) / 65536; + this->load15b = ((`hp_avenrun[2] % 65536) * 100) / 65536; + + /* clear screen */ + system("clear"); + + /* print load average */ + printf("%Y, load average: %d.%02d, %d.%02d, %d.%02d", + walltimestamp, this->load1a, this->load1b, this->load5a, + this->load5b, this->load15a, this->load15b); + + /* print syscall count */ + printa(" syscalls: %@d\n",@Total); + + /* print report */ + trunc(@Name, SCREEN); + printf("\n %-25s %12s\n", "PROCESS", "COUNT"); + printa(" %-25s %@12d\n", @Name); + + /* reset variables */ + trunc(@Name); + clear(@Total); + secs = 0; + } +' |