summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhunt <hunt>2005-06-28 18:04:07 +0000
committerhunt <hunt>2005-06-28 18:04:07 +0000
commit4d9dc675488169e9605222f969a32108df8f29b8 (patch)
tree69d6c2b71dffca6290ab6715d9290a4c901e191f
parent8a32c18d30dcd9dd664df74cd0c647ddfc060171 (diff)
downloadsystemtap-steved-4d9dc675488169e9605222f969a32108df8f29b8.tar.gz
systemtap-steved-4d9dc675488169e9605222f969a32108df8f29b8.tar.xz
systemtap-steved-4d9dc675488169e9605222f969a32108df8f29b8.zip
2005-06-28 Martin Hunt <hunt@redhat.com>
* bench: New probe to do benchmarks.
-rw-r--r--runtime/probes/ChangeLog6
-rw-r--r--runtime/probes/bench/bench.c62
-rw-r--r--runtime/probes/bench/bench_io1.c61
-rw-r--r--runtime/probes/bench/bench_io2.c60
-rw-r--r--runtime/probes/bench/bench_multi.c85
-rw-r--r--runtime/probes/bench/bench_ret.c75
-rwxr-xr-xruntime/probes/bench/build2
-rwxr-xr-xruntime/probes/bench/check_modules24
-rwxr-xr-xruntime/probes/bench/run_bench105
-rwxr-xr-xruntime/probes/bench/stp42
-rw-r--r--runtime/probes/bench/targets5
-rw-r--r--runtime/probes/bench/time.c68
12 files changed, 594 insertions, 1 deletions
diff --git a/runtime/probes/ChangeLog b/runtime/probes/ChangeLog
index d6cbc5c0..91c4838d 100644
--- a/runtime/probes/ChangeLog
+++ b/runtime/probes/ChangeLog
@@ -1,6 +1,10 @@
+2005-06-28 Martin Hunt <hunt@redhat.com>
+
+ * bench: New probe to do benchmarks.
+
2005-06-23 Martin Hunt <hunt@redhat.com>
- * all probes: MOdified to use latest changes to transport.h.
+ * all probes: Modified to use latest changes to transport.h.
2005-06-21 Martin Hunt <hunt@redhat.com>
diff --git a/runtime/probes/bench/bench.c b/runtime/probes/bench/bench.c
new file mode 100644
index 00000000..9192d3f2
--- /dev/null
+++ b/runtime/probes/bench/bench.c
@@ -0,0 +1,62 @@
+#define STP_NETLINK_ONLY
+#define STP_NUM_STRINGS 1
+
+#include "runtime.h"
+#include "probes.c"
+
+MODULE_DESCRIPTION("SystemTap probe: bench");
+MODULE_AUTHOR("Martin Hunt");
+
+asmlinkage ssize_t inst_sys_write (unsigned int fd, const char __user * buf, size_t count)
+{
+ jprobe_return();
+ return 0;
+}
+
+static int inst_sys_read (struct kprobe *p, struct pt_regs *regs)
+{
+ return 0;
+}
+
+static struct jprobe jp[] = {
+ {
+ .kp.addr = (kprobe_opcode_t *)"sys_write",
+ .entry = (kprobe_opcode_t *) inst_sys_write
+ },
+};
+
+static struct kprobe kp[] = {
+ {
+ .addr = "sys_read",
+ .pre_handler = inst_sys_read
+ }
+};
+
+#define NUM_JPROBES (sizeof(jp)/sizeof(struct jprobe))
+#define NUM_KPROBES (sizeof(kp)/sizeof(struct kprobe))
+
+int init_module(void)
+{
+ int ret;
+
+ TRANSPORT_OPEN;
+
+ ret = _stp_register_jprobes (jp, NUM_JPROBES);
+ if (ret >= 0)
+ ret = _stp_register_kprobes (kp, NUM_KPROBES);
+
+ return ret;
+}
+
+static void probe_exit (void)
+{
+ _stp_unregister_jprobes (jp, NUM_JPROBES);
+ _stp_unregister_kprobes (kp, NUM_KPROBES);
+}
+
+void cleanup_module(void)
+{
+ _stp_transport_close();
+}
+
+MODULE_LICENSE("GPL");
diff --git a/runtime/probes/bench/bench_io1.c b/runtime/probes/bench/bench_io1.c
new file mode 100644
index 00000000..4cc890df
--- /dev/null
+++ b/runtime/probes/bench/bench_io1.c
@@ -0,0 +1,61 @@
+#define STP_NETLINK_ONLY
+#define STP_NUM_STRINGS 1
+
+#include "runtime.h"
+#include "probes.c"
+
+MODULE_DESCRIPTION("SystemTap probe: bench_io");
+MODULE_AUTHOR("Martin Hunt");
+
+static int inst_sys_read (struct kprobe *p, struct pt_regs *regs)
+{
+ /* print 100 chars */
+ _stp_printf ("123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\n");
+ _stp_print_flush();
+ return 0;
+}
+
+static int inst_sys_write (struct kprobe *p, struct pt_regs *regs)
+{
+ /* print 100 chars */
+ _stp_print_cstr ("123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\n");
+ _stp_print_flush();
+ return 0;
+}
+
+static struct kprobe kp[] = {
+ {
+ .addr = "sys_read",
+ .pre_handler = inst_sys_read
+ },
+ {
+ .addr = "sys_write",
+ .pre_handler = inst_sys_write
+ }
+};
+
+#define NUM_KPROBES (sizeof(kp)/sizeof(struct kprobe))
+
+int init_module(void)
+{
+ int ret;
+
+ TRANSPORT_OPEN;
+
+ ret = _stp_register_kprobes (kp, NUM_KPROBES);
+ return ret;
+}
+
+static void probe_exit (void)
+{
+ _stp_unregister_kprobes (kp, NUM_KPROBES);
+ _stp_printf("dropped %d packets\n", atomic_read(&_stp_transport_failures));
+ _stp_print_flush();
+}
+
+void cleanup_module(void)
+{
+ _stp_transport_close();
+}
+
+MODULE_LICENSE("GPL");
diff --git a/runtime/probes/bench/bench_io2.c b/runtime/probes/bench/bench_io2.c
new file mode 100644
index 00000000..d606fa64
--- /dev/null
+++ b/runtime/probes/bench/bench_io2.c
@@ -0,0 +1,60 @@
+//#define STP_NETLINK_ONLY
+#define STP_NUM_STRINGS 1
+
+#include "runtime.h"
+#include "probes.c"
+
+MODULE_DESCRIPTION("SystemTap probe: bench_io");
+MODULE_AUTHOR("Martin Hunt");
+
+static int inst_sys_read (struct kprobe *p, struct pt_regs *regs)
+{
+ /* print 100 chars */
+ _stp_printf ("123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\n");
+ _stp_print_flush();
+ return 0;
+}
+
+static int inst_sys_write (struct kprobe *p, struct pt_regs *regs)
+{
+ /* print 100 chars */
+ _stp_print_cstr ("123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\n");
+ _stp_print_flush();
+ return 0;
+}
+
+static struct kprobe kp[] = {
+ {
+ .addr = "sys_read",
+ .pre_handler = inst_sys_read
+ },
+ {
+ .addr = "sys_write",
+ .pre_handler = inst_sys_write
+ }
+};
+
+#define NUM_KPROBES (sizeof(kp)/sizeof(struct kprobe))
+
+int init_module(void)
+{
+ int ret;
+
+ TRANSPORT_OPEN;
+
+ ret = _stp_register_kprobes (kp, NUM_KPROBES);
+ return ret;
+}
+
+static void probe_exit (void)
+{
+ _stp_unregister_kprobes (kp, NUM_KPROBES);
+ _stp_print_flush();
+}
+
+void cleanup_module(void)
+{
+ _stp_transport_close();
+}
+
+MODULE_LICENSE("GPL");
diff --git a/runtime/probes/bench/bench_multi.c b/runtime/probes/bench/bench_multi.c
new file mode 100644
index 00000000..566e8520
--- /dev/null
+++ b/runtime/probes/bench/bench_multi.c
@@ -0,0 +1,85 @@
+#define STP_NETLINK_ONLY
+#define STP_NUM_STRINGS 1
+
+#include "runtime.h"
+#include "probes.c"
+
+MODULE_DESCRIPTION("SystemTap probe: bench_multi");
+MODULE_AUTHOR("Martin Hunt");
+
+static int inst_sys_read1 (struct kprobe *p, struct pt_regs *regs)
+{
+ return 0;
+}
+static int inst_sys_read2 (struct kprobe *p, struct pt_regs *regs)
+{
+ return 0;
+}
+
+static int inst_sys_write1 (struct kprobe *p, struct pt_regs *regs)
+{
+ return 0;
+}
+static int inst_sys_write2 (struct kprobe *p, struct pt_regs *regs)
+{
+ return 0;
+}
+static int inst_sys_write3 (struct kprobe *p, struct pt_regs *regs)
+{
+ return 0;
+}
+static int inst_sys_write4 (struct kprobe *p, struct pt_regs *regs)
+{
+ return 0;
+}
+
+static struct kprobe kp[] = {
+ {
+ .addr = "sys_read",
+ .pre_handler = inst_sys_read1
+ },
+ {
+ .addr = "sys_read",
+ .pre_handler = inst_sys_read2
+ },
+ {
+ .addr = "sys_write",
+ .pre_handler = inst_sys_write1
+ },
+ {
+ .addr = "sys_write",
+ .pre_handler = inst_sys_write2
+ },
+ {
+ .addr = "sys_write",
+ .pre_handler = inst_sys_write3
+ },
+ {
+ .addr = "sys_write",
+ .pre_handler = inst_sys_write4
+ }
+};
+
+#define NUM_KPROBES (sizeof(kp)/sizeof(struct kprobe))
+
+int init_module(void)
+{
+ int ret;
+
+ TRANSPORT_OPEN;
+
+ ret = _stp_register_kprobes (kp, NUM_KPROBES);
+ return ret;
+}
+
+static void probe_exit (void)
+{
+ _stp_unregister_kprobes (kp, NUM_KPROBES);
+}
+
+void cleanup_module(void)
+{
+ _stp_transport_close();
+}
+
+MODULE_LICENSE("GPL");
diff --git a/runtime/probes/bench/bench_ret.c b/runtime/probes/bench/bench_ret.c
new file mode 100644
index 00000000..9444626c
--- /dev/null
+++ b/runtime/probes/bench/bench_ret.c
@@ -0,0 +1,75 @@
+#define STP_NETLINK_ONLY
+#define STP_NUM_STRINGS 1
+#define USE_RET_PROBES
+
+#include "runtime.h"
+#include "probes.c"
+
+MODULE_DESCRIPTION("SystemTap probe: bench_ret");
+MODULE_AUTHOR("Martin Hunt");
+
+int entries = 0;
+int returns = 0;
+
+static int inst_sys_read (struct kprobe *p, struct pt_regs *regs)
+{
+ return 0;
+}
+
+static int inst_sys_write_ret (struct kprobe *p, struct pt_regs *regs)
+{
+ returns++;
+ return 0;
+}
+
+static int inst_sys_write (struct kprobe *p, struct pt_regs *regs)
+{
+ entries++;
+ return 0;
+}
+
+static struct kretprobe kpr[] = {
+ {
+ .kp.addr = "sys_read",
+ .handler = inst_sys_read
+ },
+ {
+ .kp.addr = "sys_write",
+ .handler = inst_sys_write_ret
+ }
+};
+
+static struct kprobe kp[] = {
+ {
+ .addr = "sys_write",
+ .pre_handler = inst_sys_write
+ }
+};
+
+
+#define NUM_KPROBES (sizeof(kpr)/sizeof(struct kretprobe))
+
+int init_module(void)
+{
+ int ret;
+
+ TRANSPORT_OPEN;
+
+ ret = _stp_register_kretprobes (kpr, NUM_KPROBES);
+ ret = _stp_register_kprobes (kp, 1);
+ return ret;
+}
+
+static void probe_exit (void)
+{
+ _stp_unregister_kretprobes (kpr, NUM_KPROBES);
+ _stp_unregister_kprobes (kp, 1);
+ printk("entries=%d returns=%d\n", entries, returns);
+}
+
+void cleanup_module(void)
+{
+ _stp_transport_close();
+}
+
+MODULE_LICENSE("GPL");
diff --git a/runtime/probes/bench/build b/runtime/probes/bench/build
new file mode 100755
index 00000000..f3e83244
--- /dev/null
+++ b/runtime/probes/bench/build
@@ -0,0 +1,2 @@
+#!/bin/bash
+../build_probe $*
diff --git a/runtime/probes/bench/check_modules b/runtime/probes/bench/check_modules
new file mode 100755
index 00000000..4450fe7a
--- /dev/null
+++ b/runtime/probes/bench/check_modules
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+RELAYFS=`lsmod | grep relayfs |awk '{print $1}'`
+if [ "$RELAYFS" != "relayfs" ]
+then
+ /sbin/insmod ../../relayfs/relayfs.ko
+fi
+
+if [ ! -d "/mnt/relay" ]
+then
+ mkdir /mnt/relay
+fi
+
+MOUNT=`mount | grep relayfs |awk '{print $1}'`
+if [ "$MOUNT" != "relayfs" ]
+then
+ mount -t relayfs relayfs /mnt/relay
+fi
+
+STP_CONTROL=`lsmod | grep stp_control |awk '{print $1}'`
+if [ "$STP_CONTROL" != "stp_control" ]
+then
+ /sbin/insmod ../../transport/stp-control.ko
+fi
diff --git a/runtime/probes/bench/run_bench b/runtime/probes/bench/run_bench
new file mode 100755
index 00000000..fc27731d
--- /dev/null
+++ b/runtime/probes/bench/run_bench
@@ -0,0 +1,105 @@
+#!/usr/bin/tclsh
+# -*- tcl -*-
+
+proc do_time {module} {
+ # start kprobes
+ if {[catch {exec ../../stpd/stpd -mq $module.ko > xxx &} pid]} {
+ puts $pid
+ exit -1
+ }
+
+ exec sleep 2
+
+ # get the timings while kprobes running
+ if {[catch {exec ./time} res2]} {
+ puts $res2
+ exit -1
+ }
+
+ # terminate kprobes
+ if {[catch {exec kill -s SIGINT $pid} res]} {
+ puts $res
+ }
+
+ return $res2
+}
+
+
+set nproc [exec grep processor /proc/cpuinfo | wc -l]
+if {![catch {exec grep "physical id" /proc/cpuinfo} phyid]} {
+ foreach phy [split $phyid \n] {
+ set cpu($phy) 1
+ }
+}
+set model [exec grep "model name" /proc/cpuinfo]
+set model [lindex [split $model \n] 0]
+set model [string range $model [expr [string first : $model]+1] end]
+set model [string trimleft $model]
+
+puts "STP BENCH for [exec uname -r] on [exec uname -m]"
+puts "[exec uptime]"
+if {$nproc > 1} {
+ puts "processors: $nproc ([array size cpu] physical) $model"
+} else {
+ puts "processors: $nproc $model"
+}
+puts "--------------------------------------"
+
+# load the modules
+if {[catch {exec ./check_modules} res]} {
+ puts $res
+ exit -1
+}
+
+# get the timings without kprobes
+if {[catch {exec ./time} res1]} {
+ puts $res1
+ exit -1
+}
+
+set res2 [do_time bench]
+set t_kprobe [expr [lindex $res2 0] - [lindex $res1 0]]
+set t_jprobe [expr [lindex $res2 1] - [lindex $res1 1]]
+
+puts "Jprobes overhead = $t_jprobe ns"
+puts "Kprobes overhead = $t_kprobe ns"
+puts "--------------------------------------"
+
+if {[file exists bench_ret.ko]} {
+ set res2 [do_time bench_ret]
+ set t_ret [expr [lindex $res2 0] - [lindex $res1 0]]
+ set t_entret [expr [lindex $res2 1] - [lindex $res1 1]]
+
+ puts "Return probe overhead = $t_ret ns"
+ puts "Entry+Return probe overhead = $t_entret ns"
+ puts "--------------------------------------"
+}
+
+set res2 [do_time bench_multi]
+set t_k2 [expr [lindex $res2 0] - [lindex $res1 0]]
+set t_k4 [expr [lindex $res2 1] - [lindex $res1 1]]
+
+puts "2 kprobes on same func = $t_k2 ns"
+puts "4 kprobes on same func = $t_k4 ns"
+puts "--------------------------------------"
+
+set res2 [do_time bench_io1]
+set t_printf [expr [lindex $res2 0] - [lindex $res1 0] - $t_kprobe]
+set t_print [expr [lindex $res2 1] - [lindex $res1 1] - $t_kprobe]
+
+puts "NETLINK"
+puts "_stp_printf on 100 chars = $t_printf ns"
+puts "_stp_print on 100 chars = $t_print ns"
+puts "--------------------------------------"
+exec sleep 4
+
+set res2 [do_time bench_io2]
+set t_printf [expr [lindex $res2 0] - [lindex $res1 0] - $t_kprobe]
+set t_print [expr [lindex $res2 1] - [lindex $res1 1] - $t_kprobe]
+
+puts "RELAYFS"
+puts "_stp_printf on 100 chars = $t_printf ns"
+puts "_stp_print on 100 chars = $t_print ns"
+puts "--------------------------------------"
+
+exec rm xxx
diff --git a/runtime/probes/bench/stp b/runtime/probes/bench/stp
new file mode 100755
index 00000000..8c2301c4
--- /dev/null
+++ b/runtime/probes/bench/stp
@@ -0,0 +1,42 @@
+#!/bin/bash
+if [ -n "$1" ]
+then
+ modulename=$1
+else
+ echo "Usage: stp modulename"
+ exit
+fi
+
+RELAYFS=`lsmod | grep relayfs |awk '{print $1}'`
+if [ "$RELAYFS" != "relayfs" ]
+then
+ /sbin/insmod ../../relayfs/relayfs.ko
+fi
+
+if [ ! -d "/mnt/relay" ]
+then
+ mkdir /mnt/relay
+fi
+
+MOUNT=`mount | grep relayfs |awk '{print $1}'`
+if [ "$MOUNT" != "relayfs" ]
+then
+ mount -t relayfs relayfs /mnt/relay
+fi
+
+STP_CONTROL=`lsmod | grep stp_control |awk '{print $1}'`
+if [ "$STP_CONTROL" != "stp_control" ]
+then
+ /sbin/insmod ../../transport/stp-control.ko
+fi
+
+#/sbin/insmod $modulename
+
+# print to screen only
+#../../stpd/stpd -p $modulename
+
+# print to screen and log to files (file logging only if #define STP_NETLINK_ONLY commented out in module)
+#../../stpd/stpd $modulename
+
+# no screen, log to files (file logging only if #define STP_NETLINK_ONLY commented out in module)
+../../stpd/stpd -q $modulename
diff --git a/runtime/probes/bench/targets b/runtime/probes/bench/targets
new file mode 100644
index 00000000..b8328f15
--- /dev/null
+++ b/runtime/probes/bench/targets
@@ -0,0 +1,5 @@
+bench
+bench_io1
+bench_io2
+bench_ret
+bench_multi
diff --git a/runtime/probes/bench/time.c b/runtime/probes/bench/time.c
new file mode 100644
index 00000000..fb423276
--- /dev/null
+++ b/runtime/probes/bench/time.c
@@ -0,0 +1,68 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <sys/time.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+typedef unsigned long long uint64;
+
+struct timeval t1;
+
+void start(struct timeval *tv)
+{
+ gettimeofday (tv, NULL);
+}
+
+uint64 time_delta(struct timeval *start, struct timeval *stop)
+{
+ uint64 secs, usecs;
+
+ secs = stop->tv_sec - start->tv_sec;
+ usecs = stop->tv_usec - start->tv_usec;
+ if (usecs < 0) {
+ secs--;
+ usecs += 1000000;
+ }
+ return secs * 1000000 + usecs;
+}
+
+uint64 stop(struct timeval *begin)
+{
+ struct timeval end;
+ gettimeofday (&end, NULL);
+ return time_delta (begin, &end);
+}
+
+
+int main()
+{
+ int fd, i;
+ char buf[1024];
+ uint64 nsecs;
+
+ system ("touch foo");
+ fd = open ("foo", O_RDWR);
+
+ start(&t1);
+ for (i = 0; i < 1000000; i++) {
+ if (read (fd, buf, 0) < 0)
+ perror("read");
+ }
+ nsecs = stop(&t1) / 1000;
+
+ printf("%lld ", nsecs);
+
+ start(&t1);
+ for (i = 0; i < 1000000; i++) {
+ if (write (fd, buf, 0) < 0)
+ perror("write");
+ }
+ nsecs = stop(&t1) / 1000;
+ close (fd);
+
+ printf("%lld\n", nsecs);
+
+ return 0;
+}