diff options
author | hunt <hunt> | 2005-06-28 18:04:07 +0000 |
---|---|---|
committer | hunt <hunt> | 2005-06-28 18:04:07 +0000 |
commit | 4d9dc675488169e9605222f969a32108df8f29b8 (patch) | |
tree | 69d6c2b71dffca6290ab6715d9290a4c901e191f | |
parent | 8a32c18d30dcd9dd664df74cd0c647ddfc060171 (diff) | |
download | systemtap-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/ChangeLog | 6 | ||||
-rw-r--r-- | runtime/probes/bench/bench.c | 62 | ||||
-rw-r--r-- | runtime/probes/bench/bench_io1.c | 61 | ||||
-rw-r--r-- | runtime/probes/bench/bench_io2.c | 60 | ||||
-rw-r--r-- | runtime/probes/bench/bench_multi.c | 85 | ||||
-rw-r--r-- | runtime/probes/bench/bench_ret.c | 75 | ||||
-rwxr-xr-x | runtime/probes/bench/build | 2 | ||||
-rwxr-xr-x | runtime/probes/bench/check_modules | 24 | ||||
-rwxr-xr-x | runtime/probes/bench/run_bench | 105 | ||||
-rwxr-xr-x | runtime/probes/bench/stp | 42 | ||||
-rw-r--r-- | runtime/probes/bench/targets | 5 | ||||
-rw-r--r-- | runtime/probes/bench/time.c | 68 |
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; +} |