Path: blob/master/tools/perf/scripts/python/sctop.py
10823 views
# system call top1# (c) 2010, Tom Zanussi <[email protected]>2# Licensed under the terms of the GNU GPL License version 23#4# Periodically displays system-wide system call totals, broken down by5# syscall. If a [comm] arg is specified, only syscalls called by6# [comm] are displayed. If an [interval] arg is specified, the display7# will be refreshed every [interval] seconds. The default interval is8# 3 seconds.910import os, sys, thread, time1112sys.path.append(os.environ['PERF_EXEC_PATH'] + \13'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')1415from perf_trace_context import *16from Core import *17from Util import *1819usage = "perf script -s sctop.py [comm] [interval]\n";2021for_comm = None22default_interval = 323interval = default_interval2425if len(sys.argv) > 3:26sys.exit(usage)2728if len(sys.argv) > 2:29for_comm = sys.argv[1]30interval = int(sys.argv[2])31elif len(sys.argv) > 1:32try:33interval = int(sys.argv[1])34except ValueError:35for_comm = sys.argv[1]36interval = default_interval3738syscalls = autodict()3940def trace_begin():41thread.start_new_thread(print_syscall_totals, (interval,))42pass4344def raw_syscalls__sys_enter(event_name, context, common_cpu,45common_secs, common_nsecs, common_pid, common_comm,46id, args):47if for_comm is not None:48if common_comm != for_comm:49return50try:51syscalls[id] += 152except TypeError:53syscalls[id] = 15455def print_syscall_totals(interval):56while 1:57clear_term()58if for_comm is not None:59print "\nsyscall events for %s:\n\n" % (for_comm),60else:61print "\nsyscall events:\n\n",6263print "%-40s %10s\n" % ("event", "count"),64print "%-40s %10s\n" % ("----------------------------------------", \65"----------"),6667for id, val in sorted(syscalls.iteritems(), key = lambda(k, v): (v, k), \68reverse = True):69try:70print "%-40s %10d\n" % (syscall_name(id), val),71except TypeError:72pass73syscalls.clear()74time.sleep(interval)757677