1 # futex contention 1 # futex contention 2 # (c) 2010, Arnaldo Carvalho de Melo <acme@redh 2 # (c) 2010, Arnaldo Carvalho de Melo <acme@redhat.com> 3 # Licensed under the terms of the GNU GPL Lice 3 # Licensed under the terms of the GNU GPL License version 2 4 # 4 # 5 # Translation of: 5 # Translation of: 6 # 6 # 7 # http://sourceware.org/systemtap/wiki/WSFutex 7 # http://sourceware.org/systemtap/wiki/WSFutexContention 8 # 8 # 9 # to perf python scripting. 9 # to perf python scripting. 10 # 10 # 11 # Measures futex contention 11 # Measures futex contention 12 12 13 from __future__ import print_function 13 from __future__ import print_function 14 14 15 import os 15 import os 16 import sys 16 import sys 17 sys.path.append(os.environ['PERF_EXEC_PATH'] + 17 sys.path.append(os.environ['PERF_EXEC_PATH'] + 18 '/scripts/python/Perf-Trace-Ut 18 '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') 19 from Util import * 19 from Util import * 20 20 21 process_names = {} 21 process_names = {} 22 thread_thislock = {} 22 thread_thislock = {} 23 thread_blocktime = {} 23 thread_blocktime = {} 24 24 25 lock_waits = {} # long-lived stats on (tid,lo 25 lock_waits = {} # long-lived stats on (tid,lock) blockage elapsed time 26 process_names = {} # long-lived pid-to-execna 26 process_names = {} # long-lived pid-to-execname mapping 27 27 28 28 29 def syscalls__sys_enter_futex(event, ctxt, cpu 29 def syscalls__sys_enter_futex(event, ctxt, cpu, s, ns, tid, comm, callchain, 30 nr, uaddr, op, v 30 nr, uaddr, op, val, utime, uaddr2, val3): 31 cmd = op & FUTEX_CMD_MASK 31 cmd = op & FUTEX_CMD_MASK 32 if cmd != FUTEX_WAIT: 32 if cmd != FUTEX_WAIT: 33 return # we don't care about originat 33 return # we don't care about originators of WAKE events 34 34 35 process_names[tid] = comm 35 process_names[tid] = comm 36 thread_thislock[tid] = uaddr 36 thread_thislock[tid] = uaddr 37 thread_blocktime[tid] = nsecs(s, ns) 37 thread_blocktime[tid] = nsecs(s, ns) 38 38 39 39 40 def syscalls__sys_exit_futex(event, ctxt, cpu, 40 def syscalls__sys_exit_futex(event, ctxt, cpu, s, ns, tid, comm, callchain, 41 nr, ret): 41 nr, ret): 42 if tid in thread_blocktime: 42 if tid in thread_blocktime: 43 elapsed = nsecs(s, ns) - thread_blockt 43 elapsed = nsecs(s, ns) - thread_blocktime[tid] 44 add_stats(lock_waits, (tid, thread_thi 44 add_stats(lock_waits, (tid, thread_thislock[tid]), elapsed) 45 del thread_blocktime[tid] 45 del thread_blocktime[tid] 46 del thread_thislock[tid] 46 del thread_thislock[tid] 47 47 48 48 49 def trace_begin(): 49 def trace_begin(): 50 print("Press control+C to stop and show th 50 print("Press control+C to stop and show the summary") 51 51 52 52 53 def trace_end(): 53 def trace_end(): 54 for (tid, lock) in lock_waits: 54 for (tid, lock) in lock_waits: 55 min, max, avg, count = lock_waits[tid, 55 min, max, avg, count = lock_waits[tid, lock] 56 print("%s[%d] lock %x contended %d tim 56 print("%s[%d] lock %x contended %d times, %d avg ns [max: %d ns, min %d ns]" % 57 (process_names[tid], tid, lock, 57 (process_names[tid], tid, lock, count, avg, max, min))
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.