summaryrefslogtreecommitdiffstats
path: root/testsuite/systemtap.examples/profiling
diff options
context:
space:
mode:
authorWilliam Cohen <wcohen@redhat.com>2009-01-28 16:03:01 -0500
committerWilliam Cohen <wcohen@redhat.com>2009-01-28 16:03:01 -0500
commitff90b2974f841b92434cb46d89c39f08d01cc966 (patch)
tree72f653b6e9922ff727b6f747b87f222156d5b57e /testsuite/systemtap.examples/profiling
parentffaf6b84d9a3820d538e2d20df0e19e7fd0607d8 (diff)
downloadsystemtap-steved-ff90b2974f841b92434cb46d89c39f08d01cc966.tar.gz
systemtap-steved-ff90b2974f841b92434cb46d89c39f08d01cc966.tar.xz
systemtap-steved-ff90b2974f841b92434cb46d89c39f08d01cc966.zip
Add the polling timeout example and update the catalog.
Diffstat (limited to 'testsuite/systemtap.examples/profiling')
-rw-r--r--testsuite/systemtap.examples/profiling/timeout.meta13
-rw-r--r--testsuite/systemtap.examples/profiling/timeout.stp102
2 files changed, 115 insertions, 0 deletions
diff --git a/testsuite/systemtap.examples/profiling/timeout.meta b/testsuite/systemtap.examples/profiling/timeout.meta
new file mode 100644
index 00000000..aa683c0a
--- /dev/null
+++ b/testsuite/systemtap.examples/profiling/timeout.meta
@@ -0,0 +1,13 @@
+title: Show Processes Doing Polling Operations
+name: timeout.stp
+version: 1.0
+author: Uli Drepper and William Cohen
+keywords: profiling
+subsystem: kernel
+status: production
+exit: user-controlled
+output: sorted-list
+scope: system-wide
+description: The timeout.stp script is based on a blog entry (http://udrepper.livejournal.com/19041.html) mentioning a need for a tool to help developers find applications that are polling. The timeout.stp script monitors systemcall used for polling and records the systemcalls that timed out rather than returned because some action occurred. The script updates the screen once a second with the top twenty processes.
+test_check: stap -p4 timeout.stp
+test_installcheck: stap timeout.stp -c "sleep 1"
diff --git a/testsuite/systemtap.examples/profiling/timeout.stp b/testsuite/systemtap.examples/profiling/timeout.stp
new file mode 100644
index 00000000..48d6d21d
--- /dev/null
+++ b/testsuite/systemtap.examples/profiling/timeout.stp
@@ -0,0 +1,102 @@
+#! /usr/bin/env stap
+# Copyright (C) 2009 Red Hat, Inc.
+# Written by Ulrich Drepper <drepper@redhat.com>
+# Modified by William Cohen <wcohen@redhat.com>
+
+global process, timeout_count, to
+global poll_timeout, epoll_timeout, select_timeout, itimer_timeout
+global nanosleep_timeout, futex_timeout, signal_timeout
+
+probe syscall.poll, syscall.epoll_wait {
+ if (timeout) to[pid()]=timeout
+}
+
+probe syscall.poll.return {
+ p = pid()
+ if ($return == 0 && to[p] > 0 ) {
+ poll_timeout[p]++
+ timeout_count[p]++
+ process[p] = execname()
+ delete to[p]
+ }
+}
+
+probe syscall.epoll_wait.return {
+ p = pid()
+ if ($return == 0 && to[p] > 0 ) {
+ epoll_timeout[p]++
+ timeout_count[p]++
+ process[p] = execname()
+ delete to[p]
+ }
+}
+
+probe syscall.select.return {
+ if ($return == 0) {
+ p = pid()
+ select_timeout[p]++
+ timeout_count[p]++
+ process[p] = execname()
+ }
+}
+
+probe syscall.futex.return {
+ if (errno_str($return) == "ETIMEDOUT") {
+ p = pid()
+ futex_timeout[p]++
+ timeout_count[p]++
+ process[p] = execname()
+ }
+}
+
+probe syscall.nanosleep.return {
+ if ($return == 0) {
+ p = pid()
+ nanosleep_timeout[p]++
+ timeout_count[p]++
+ process[p] = execname()
+ }
+}
+
+probe kernel.function("it_real_fn") {
+ p = pid()
+ itimer_timeout[p]++
+ timeout_count[p]++
+ process[p] = execname()
+}
+
+probe syscall.rt_sigtimedwait.return {
+ if (errno_str($return) == "EAGAIN") {
+ p = pid()
+ signal_timeout[p]++
+ timeout_count[p]++
+ process[p] = execname()
+ }
+}
+
+probe syscall.exit {
+ p = pid()
+ if (p in process) {
+ delete process[p]
+ delete timeout_count[p]
+ delete poll_timeout[p]
+ delete epoll_timeout[p]
+ delete select_timeout[p]
+ delete itimer_timeout[p]
+ delete futex_timeout[p]
+ delete nanosleep_timeout[p]
+ delete signal_timeout[p]
+ }
+}
+
+probe timer.s(1) {
+ printf("\033[2J\033[1;1H") /* clear screen */
+ printf (" uid | poll select epoll itimer futex nanosle signal| process\n")
+ foreach (p in timeout_count- limit 20) {
+ printf ("%5d |%7d %7d %7d %7d %7d %7d %7d| %-.38s\n", p,
+ poll_timeout[p], select_timeout[p],
+ epoll_timeout[p], itimer_timeout[p],
+ futex_timeout[p], nanosleep_timeout[p],
+ signal_timeout[p], process[p])
+ }
+}