Path: blob/master/tools/perf/scripts/python/futex-contention.py
10823 views
# futex contention1# (c) 2010, Arnaldo Carvalho de Melo <[email protected]>2# Licensed under the terms of the GNU GPL License version 23#4# Translation of:5#6# http://sourceware.org/systemtap/wiki/WSFutexContention7#8# to perf python scripting.9#10# Measures futex contention1112import os, sys13sys.path.append(os.environ['PERF_EXEC_PATH'] + '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')14from Util import *1516process_names = {}17thread_thislock = {}18thread_blocktime = {}1920lock_waits = {} # long-lived stats on (tid,lock) blockage elapsed time21process_names = {} # long-lived pid-to-execname mapping2223def syscalls__sys_enter_futex(event, ctxt, cpu, s, ns, tid, comm,24nr, uaddr, op, val, utime, uaddr2, val3):25cmd = op & FUTEX_CMD_MASK26if cmd != FUTEX_WAIT:27return # we don't care about originators of WAKE events2829process_names[tid] = comm30thread_thislock[tid] = uaddr31thread_blocktime[tid] = nsecs(s, ns)3233def syscalls__sys_exit_futex(event, ctxt, cpu, s, ns, tid, comm,34nr, ret):35if thread_blocktime.has_key(tid):36elapsed = nsecs(s, ns) - thread_blocktime[tid]37add_stats(lock_waits, (tid, thread_thislock[tid]), elapsed)38del thread_blocktime[tid]39del thread_thislock[tid]4041def trace_begin():42print "Press control+C to stop and show the summary"4344def trace_end():45for (tid, lock) in lock_waits:46min, max, avg, count = lock_waits[tid, lock]47print "%s[%d] lock %x contended %d times, %d avg ns" % \48(process_names[tid], tid, lock, count, avg)49505152