summaryrefslogtreecommitdiffstats
path: root/cddl/contrib/dtracetoolkit/Proc/topsysproc
diff options
context:
space:
mode:
Diffstat (limited to 'cddl/contrib/dtracetoolkit/Proc/topsysproc')
-rwxr-xr-xcddl/contrib/dtracetoolkit/Proc/topsysproc121
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;
+ }
+'
OpenPOWER on IntegriCloud