1e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# system call top 2e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# (c) 2010, Tom Zanussi <tzanussi@gmail.com> 3e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# Licensed under the terms of the GNU GPL License version 2 4e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# 5e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# Periodically displays system-wide system call totals, broken down by 6e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# syscall. If a [comm] arg is specified, only syscalls called by 7e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# [comm] are displayed. If an [interval] arg is specified, the display 8e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# will be refreshed every [interval] seconds. The default interval is 9e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# 3 seconds. 10e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 11e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengimport os, sys, thread, time 12e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 13e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsys.path.append(os.environ['PERF_EXEC_PATH'] + \ 14e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') 15e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 16e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengfrom perf_trace_context import * 17e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengfrom Core import * 18e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengfrom Util import * 19e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 20e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengusage = "perf script -s sctop.py [comm] [interval]\n"; 21e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 22e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengfor_comm = None 23e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengdefault_interval = 3 24e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chenginterval = default_interval 25e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 26e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengif len(sys.argv) > 3: 27e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng sys.exit(usage) 28e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 29e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengif len(sys.argv) > 2: 30e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng for_comm = sys.argv[1] 31e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng interval = int(sys.argv[2]) 32e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengelif len(sys.argv) > 1: 33e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng try: 34e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng interval = int(sys.argv[1]) 35e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng except ValueError: 36e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng for_comm = sys.argv[1] 37e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng interval = default_interval 38e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 39e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsyscalls = autodict() 40e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 41e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengdef trace_begin(): 42e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng thread.start_new_thread(print_syscall_totals, (interval,)) 43e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng pass 44e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 45e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengdef raw_syscalls__sys_enter(event_name, context, common_cpu, 46e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng common_secs, common_nsecs, common_pid, common_comm, 47e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng id, args): 48e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if for_comm is not None: 49e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if common_comm != for_comm: 50e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return 51e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng try: 52e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng syscalls[id] += 1 53e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng except TypeError: 54e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng syscalls[id] = 1 55e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 56e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengdef print_syscall_totals(interval): 57e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng while 1: 58e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng clear_term() 59e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if for_comm is not None: 60e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng print "\nsyscall events for %s:\n\n" % (for_comm), 61e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng else: 62e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng print "\nsyscall events:\n\n", 63e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 64e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng print "%-40s %10s\n" % ("event", "count"), 65e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng print "%-40s %10s\n" % ("----------------------------------------", \ 66e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng "----------"), 67e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 68e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng for id, val in sorted(syscalls.iteritems(), key = lambda(k, v): (v, k), \ 69e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng reverse = True): 70e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng try: 71e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng print "%-40s %10d\n" % (syscall_name(id), val), 72e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng except TypeError: 73e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng pass 74e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng syscalls.clear() 75e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng time.sleep(interval) 76