2 # (c) 2010, Arnaldo Carvalho de Melo <acme@redhat.com>
3 # Licensed under the terms of the GNU GPL License version 2
7 # http://sourceware.org/systemtap/wiki/WSFutexContention
9 # to perf python scripting.
11 # Measures futex contention
13 from __future__
import print_function
17 sys
.path
.append(os
.environ
['PERF_EXEC_PATH'] +
18 '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
25 lock_waits
= {} # long-lived stats on (tid,lock) blockage elapsed time
26 process_names
= {} # long-lived pid-to-execname mapping
29 def syscalls__sys_enter_futex(event
, ctxt
, cpu
, s
, ns
, tid
, comm
, callchain
,
30 nr
, uaddr
, op
, val
, utime
, uaddr2
, val3
):
31 cmd
= op
& FUTEX_CMD_MASK
33 return # we don't care about originators of WAKE events
35 process_names
[tid
] = comm
36 thread_thislock
[tid
] = uaddr
37 thread_blocktime
[tid
] = nsecs(s
, ns
)
40 def syscalls__sys_exit_futex(event
, ctxt
, cpu
, s
, ns
, tid
, comm
, callchain
,
42 if tid
in thread_blocktime
:
43 elapsed
= nsecs(s
, ns
) - thread_blocktime
[tid
]
44 add_stats(lock_waits
, (tid
, thread_thislock
[tid
]), elapsed
)
45 del thread_blocktime
[tid
]
46 del thread_thislock
[tid
]
50 print("Press control+C to stop and show the summary")
54 for (tid
, lock
) in lock_waits
:
55 min, max, avg
, count
= lock_waits
[tid
, lock
]
56 print("%s[%d] lock %x contended %d times, %d avg ns [max: %d ns, min %d ns]" %
57 (process_names
[tid
], tid
, lock
, count
, avg
, max, min))