1*4882a593Smuzhiyun# system call top 2*4882a593Smuzhiyun# (c) 2010, Tom Zanussi <tzanussi@gmail.com> 3*4882a593Smuzhiyun# Licensed under the terms of the GNU GPL License version 2 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun# Periodically displays system-wide system call totals, broken down by 6*4882a593Smuzhiyun# syscall. If a [comm] arg is specified, only syscalls called by 7*4882a593Smuzhiyun# [comm] are displayed. If an [interval] arg is specified, the display 8*4882a593Smuzhiyun# will be refreshed every [interval] seconds. The default interval is 9*4882a593Smuzhiyun# 3 seconds. 10*4882a593Smuzhiyun 11*4882a593Smuzhiyunfrom __future__ import print_function 12*4882a593Smuzhiyun 13*4882a593Smuzhiyunimport os, sys, time 14*4882a593Smuzhiyun 15*4882a593Smuzhiyuntry: 16*4882a593Smuzhiyun import thread 17*4882a593Smuzhiyunexcept ImportError: 18*4882a593Smuzhiyun import _thread as thread 19*4882a593Smuzhiyun 20*4882a593Smuzhiyunsys.path.append(os.environ['PERF_EXEC_PATH'] + \ 21*4882a593Smuzhiyun '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') 22*4882a593Smuzhiyun 23*4882a593Smuzhiyunfrom perf_trace_context import * 24*4882a593Smuzhiyunfrom Core import * 25*4882a593Smuzhiyunfrom Util import * 26*4882a593Smuzhiyun 27*4882a593Smuzhiyunusage = "perf script -s sctop.py [comm] [interval]\n"; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyunfor_comm = None 30*4882a593Smuzhiyundefault_interval = 3 31*4882a593Smuzhiyuninterval = default_interval 32*4882a593Smuzhiyun 33*4882a593Smuzhiyunif len(sys.argv) > 3: 34*4882a593Smuzhiyun sys.exit(usage) 35*4882a593Smuzhiyun 36*4882a593Smuzhiyunif len(sys.argv) > 2: 37*4882a593Smuzhiyun for_comm = sys.argv[1] 38*4882a593Smuzhiyun interval = int(sys.argv[2]) 39*4882a593Smuzhiyunelif len(sys.argv) > 1: 40*4882a593Smuzhiyun try: 41*4882a593Smuzhiyun interval = int(sys.argv[1]) 42*4882a593Smuzhiyun except ValueError: 43*4882a593Smuzhiyun for_comm = sys.argv[1] 44*4882a593Smuzhiyun interval = default_interval 45*4882a593Smuzhiyun 46*4882a593Smuzhiyunsyscalls = autodict() 47*4882a593Smuzhiyun 48*4882a593Smuzhiyundef trace_begin(): 49*4882a593Smuzhiyun thread.start_new_thread(print_syscall_totals, (interval,)) 50*4882a593Smuzhiyun pass 51*4882a593Smuzhiyun 52*4882a593Smuzhiyundef raw_syscalls__sys_enter(event_name, context, common_cpu, 53*4882a593Smuzhiyun common_secs, common_nsecs, common_pid, common_comm, 54*4882a593Smuzhiyun common_callchain, id, args): 55*4882a593Smuzhiyun if for_comm is not None: 56*4882a593Smuzhiyun if common_comm != for_comm: 57*4882a593Smuzhiyun return 58*4882a593Smuzhiyun try: 59*4882a593Smuzhiyun syscalls[id] += 1 60*4882a593Smuzhiyun except TypeError: 61*4882a593Smuzhiyun syscalls[id] = 1 62*4882a593Smuzhiyun 63*4882a593Smuzhiyundef syscalls__sys_enter(event_name, context, common_cpu, 64*4882a593Smuzhiyun common_secs, common_nsecs, common_pid, common_comm, 65*4882a593Smuzhiyun id, args): 66*4882a593Smuzhiyun raw_syscalls__sys_enter(**locals()) 67*4882a593Smuzhiyun 68*4882a593Smuzhiyundef print_syscall_totals(interval): 69*4882a593Smuzhiyun while 1: 70*4882a593Smuzhiyun clear_term() 71*4882a593Smuzhiyun if for_comm is not None: 72*4882a593Smuzhiyun print("\nsyscall events for %s:\n" % (for_comm)) 73*4882a593Smuzhiyun else: 74*4882a593Smuzhiyun print("\nsyscall events:\n") 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun print("%-40s %10s" % ("event", "count")) 77*4882a593Smuzhiyun print("%-40s %10s" % 78*4882a593Smuzhiyun ("----------------------------------------", 79*4882a593Smuzhiyun "----------")) 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun for id, val in sorted(syscalls.items(), 82*4882a593Smuzhiyun key = lambda kv: (kv[1], kv[0]), 83*4882a593Smuzhiyun reverse = True): 84*4882a593Smuzhiyun try: 85*4882a593Smuzhiyun print("%-40s %10d" % (syscall_name(id), val)) 86*4882a593Smuzhiyun except TypeError: 87*4882a593Smuzhiyun pass 88*4882a593Smuzhiyun syscalls.clear() 89*4882a593Smuzhiyun time.sleep(interval) 90