/usr/share/systemtap/examples/process
NameSizeModeActions
auditbt.meta4290644editdlrm
auditbt.stp6220755editdlrm
auditbt.tcl790644editdlrm
chng_cpu.meta7750644editdlrm
chng_cpu.stp10490755editdlrm
chng_cpu.tcl1400644editdlrm
cycle_thief.meta10820644editdlrm
cycle_thief.stp28930755editdlrm
cycle_thief.txt59740644editdlrm
errsnoop.meta5750644editdlrm
errsnoop.stp10150755editdlrm
forktracker.meta5250644editdlrm
forktracker.stp6010755editdlrm
futexes.meta5200644editdlrm
futexes.stp11180755editdlrm
futexes.txt9440644editdlrm
futexes2.meta5930644editdlrm
futexes2.stp20140644editdlrm
ltrace.meta3140644editdlrm
ltrace.stp30070755editdlrm
ltrace.tcl1220644editdlrm
migrate.meta7460644editdlrm
migrate.stp10370755editdlrm
mutex-contention.meta4790644editdlrm
mutex-contention.stp55590755editdlrm
mutex-contention.tcl790644editdlrm
noptrace.meta5120644editdlrm
noptrace.stp22350755editdlrm
noptrace.txt12120644editdlrm
pfiles.meta4500644editdlrm
pfiles.stp245230755editdlrm
plimit.meta3870644editdlrm
plimit.stp30290755editdlrm
procmod_watcher.meta6570644editdlrm
procmod_watcher.stp24060644editdlrm
proctop.meta6010644editdlrm
proctop.stp42450755editdlrm
proctop.txt86540644editdlrm
proc_snoop.stp11330755editdlrm
proc_snoop_parser.xml8180644editdlrm
proc_snoop_parser_instructions.txt21800644editdlrm
psig.meta3540644editdlrm
psig.stp56160755editdlrm
pstrace_exec.meta5450644editdlrm
pstrace_exec.stp4650755editdlrm
pstree.meta4550644editdlrm
pstree.stp19570755editdlrm
rlimit_nofile.meta3190644editdlrm
rlimit_nofile.stp11510755editdlrm
sched-latency.meta4700644editdlrm
sched-latency.stp5080644editdlrm
sched-latency.txt15660644editdlrm
schedtimes.meta8140644editdlrm
schedtimes.stp39490755editdlrm
schedtimes.txt32780644editdlrm
semop-watch.meta2670644editdlrm
semop-watch.stp8220755editdlrm
sigkill.meta5600644editdlrm
sigkill.stp6560755editdlrm
sigmon.meta6690644editdlrm
sigmon.stp9320755editdlrm
sig_by_pid.meta3570644editdlrm
sig_by_pid.stp10780755editdlrm
sig_by_pid.txt15140644editdlrm
sig_by_proc.meta3640644editdlrm
sig_by_proc.stp8510755editdlrm
sig_by_proc.txt9510644editdlrm
sleepingBeauties.meta5810644editdlrm
sleepingBeauties.stp13640755editdlrm
sleepingBeauties.tcl1400644editdlrm
sleeptime.meta6010644editdlrm
sleeptime.stp14690755editdlrm
spawn_seeker.meta8540644editdlrm
spawn_seeker.stp15260755editdlrm
spawn_seeker.txt13180644editdlrm
strace.meta3850644editdlrm
strace.stp20810755editdlrm
strace.txt36720644editdlrm
syscalls_by_pid.meta5140644editdlrm
syscalls_by_pid.stp6330755editdlrm
syscalls_by_pid.txt5970644editdlrm
syscalls_by_proc.meta5310644editdlrm
syscalls_by_proc.stp6920755editdlrm
syscalls_by_proc.txt11300644editdlrm
syscalltimes62910755editdlrm
syscalltimes.meta4540644editdlrm
syscalltimes.txt114590644editdlrm
thread-business.meta3460644editdlrm
thread-business.stp8660755editdlrm
thread-business.txt28230644editdlrm
threadstacks.meta5850644editdlrm
threadstacks.stp17890755editdlrm
threadstacks.tcl790644editdlrm
wait4time.meta6580644editdlrm
wait4time.stp13470755editdlrm
Edit: /usr/share/systemtap/examples/process/mutex-contention.stp (5559B)
#!/usr/bin/stap // NOTE: a popup mutex is one that is seen in contention but the init // of it was not detected not sure why there are popups - static mutex // init? // stack trace where mutex was initialized, if known global mutex_init_stack // stack trace where mutex was first referenced, if init stack not known global mutex_uninit // stats about the contention on this mutex global mutex_contention // usymdata for this mutex global mutex_names // stack trace of last contention for this mutex global mutex_last_cont_stack // NOTE: the way 389 works is that many common mutexes are initialized // in the same place. For example - each connection object has its // own mutex - there may be thousands of these. They are all // initialized in the same place - same with entry objects, where // there may be millions. So, if we want to get aggregate contention // statistics for _all_ connection objects, not just each individual // one, we have to keep track of each unique call stack. This is what // mutex_cont_stack is used for. // stats about unique stacks global mutex_cont_stack // report mutexes that had more than this many contentions global cont_count_threshold = 1 // usec - report mutexes that had a max time more than this global cont_max_threshold = 100000 global verbose = 0 global keep_stats = 1 /* ... and a variant of the futexes.stp script: */ global FUTEX_WAIT = 0 /*, FUTEX_WAKE = 1 */ global FUTEX_PRIVATE_FLAG = 128 /* linux 2.6.22+ */ global FUTEX_CLOCK_REALTIME = 256 /* linux 2.6.29+ */ function process_mutex_init(mutex, ppfunc) { if (verbose && (mutex in mutex_init_stack)) { printf("error: %s: mutex %p is already initialized at\n%s\n", ppfunc, mutex, mutex_init_stack[mutex]) } if (keep_stats) { mutex_init_stack[mutex] = sprint_ubacktrace() mutex_names[mutex] = usymdata (mutex) } else { printf("init %p at\n%s\n", mutex, sprint_ubacktrace()) } if (verbose) { printf("%s: mutex %p %s\n", ppfunc, mutex, mutex_names[mutex]) } } function show_contention(mutex, stack, type) { count = @count(mutex_contention[mutex]) max = @max(mutex_contention[mutex]) if ((count > cont_count_threshold) || (max > cont_max_threshold)) { printf("=======================================\nmutex %p (%s) contended %d times, %d avg usec, %d max usec, %d total usec, %s at\n%s\n", mutex, mutex_names[mutex], count, @avg(mutex_contention[mutex]), max, @sum(mutex_contention[mutex]), type, stack) if (mutex in mutex_last_cont_stack) { printf("\nmutex was last contended at\n%s\n", mutex_last_cont_stack[mutex]) } } } // we use @defined($muex) and @defined($rwlock) here because // on 64 bit systems, the wildcard search takes us through // both 64 bit and 32 bit libc (which doesn't have debuginfo), // this means the probe point resolved from the 32 bit library // has no context info probe process("/lib*/libc.so*").function("pthread_mutex_init") { if(@defined($mutex)) process_mutex_init($mutex, ppfunc()) } probe process("/lib*/libpthread.so*").function("__pthread_mutex_init") { if(@defined($mutex)) process_mutex_init($mutex, ppfunc()) } probe process("/lib*/libpthread.so*").function("__pthread_rwlock_init") { if(@defined($rwlock)) process_mutex_init($rwlock, ppfunc()) } global entry_times%, uaddrs% probe syscall.futex { if (pid() != target()) next // skip irrelevant processes if ((op & ~(FUTEX_PRIVATE_FLAG|FUTEX_CLOCK_REALTIME)) != FUTEX_WAIT) next entry_times[tid()] = gettimeofday_us() uaddrs[tid()] = futex_uaddr } probe syscall.futex.return { if (!(tid() in entry_times)) next entry = entry_times[tid()] delete entry_times[tid()] uaddr = uaddrs[tid()] delete uaddrs[tid()] elapsed = gettimeofday_us() - entry if (keep_stats) { mutex_contention[uaddr] <<< elapsed stack = sprint_ubacktrace() mutex_last_cont_stack[uaddr] = stack mutex_cont_stack[stack] <<< elapsed if (uaddr in mutex_init_stack) { if (verbose) { printf("contention time %d on mutex %p initialized at\n%s\n", elapsed, uaddr, mutex_init_stack[uaddr]) } } else if (uaddr in mutex_uninit) { if (verbose) { printf("contention time %d on popup mutex %p at\n%s\n", elapsed, uaddr, stack) } } else { if (verbose) { printf("contention time %d on popup mutex %p at\n%s\n", elapsed, uaddr, stack) } mutex_uninit[uaddr] = stack mutex_names[uaddr] = usymdata (uaddr) } } else { printf("contention %p elapsed %d at\n%s\n", uaddr, elapsed, sprint_ubacktrace()) } } probe end { if (!keep_stats) { printf("======== END\n") next } printf("<<<<<<<< aggregate stats\n") foreach (stack in mutex_cont_stack-) { count = @count(mutex_cont_stack[stack]) max = @max(mutex_cont_stack[stack]) if ((count > cont_count_threshold) || (max > cont_max_threshold)) { printf("=======================================\nstack contended %d times, %d avg usec, %d max usec, %d total usec, at\n%s\n", @count(mutex_cont_stack[stack]), @avg(mutex_cont_stack[stack]), @max(mutex_cont_stack[stack]), @sum(mutex_cont_stack[stack]), stack) } } printf(">>>>>>>> aggregate stats\n") foreach (mutex in mutex_contention-) { if (mutex in mutex_init_stack) { stack = mutex_init_stack[mutex] type = "init" } else if (mutex in mutex_uninit) { stack = mutex_uninit[mutex] type = "popup" } show_contention(mutex, stack, type) } }