Home | History | Annotate | Download | only in python
      1 # futex contention
      2 # (c) 2010, Arnaldo Carvalho de Melo <acme (at] redhat.com>
      3 # Licensed under the terms of the GNU GPL License version 2
      4 #
      5 # Translation of:
      6 #
      7 # http://sourceware.org/systemtap/wiki/WSFutexContention
      8 #
      9 # to perf python scripting.
     10 #
     11 # Measures futex contention
     12 
     13 import os, sys
     14 sys.path.append(os.environ['PERF_EXEC_PATH'] + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
     15 from Util import *
     16 
     17 process_names = {}
     18 thread_thislock = {}
     19 thread_blocktime = {}
     20 
     21 lock_waits = {} # long-lived stats on (tid,lock) blockage elapsed time
     22 process_names = {} # long-lived pid-to-execname mapping
     23 
     24 def syscalls__sys_enter_futex(event, ctxt, cpu, s, ns, tid, comm,
     25 			      nr, uaddr, op, val, utime, uaddr2, val3):
     26 	cmd = op & FUTEX_CMD_MASK
     27 	if cmd != FUTEX_WAIT:
     28 		return # we don't care about originators of WAKE events
     29 
     30 	process_names[tid] = comm
     31 	thread_thislock[tid] = uaddr
     32 	thread_blocktime[tid] = nsecs(s, ns)
     33 
     34 def syscalls__sys_exit_futex(event, ctxt, cpu, s, ns, tid, comm,
     35 			     nr, ret):
     36 	if thread_blocktime.has_key(tid):
     37 		elapsed = nsecs(s, ns) - thread_blocktime[tid]
     38 		add_stats(lock_waits, (tid, thread_thislock[tid]), elapsed)
     39 		del thread_blocktime[tid]
     40 		del thread_thislock[tid]
     41 
     42 def trace_begin():
     43 	print "Press control+C to stop and show the summary"
     44 
     45 def trace_end():
     46 	for (tid, lock) in lock_waits:
     47 		min, max, avg, count = lock_waits[tid, lock]
     48 		print "%s[%d] lock %x contended %d times, %d avg ns" % \
     49 		      (process_names[tid], tid, lock, count, avg)
     50 
     51