162306a36Sopenharmony_ci# system call top 262306a36Sopenharmony_ci# (c) 2010, Tom Zanussi <tzanussi@gmail.com> 362306a36Sopenharmony_ci# Licensed under the terms of the GNU GPL License version 2 462306a36Sopenharmony_ci# 562306a36Sopenharmony_ci# Periodically displays system-wide system call totals, broken down by 662306a36Sopenharmony_ci# syscall. If a [comm] arg is specified, only syscalls called by 762306a36Sopenharmony_ci# [comm] are displayed. If an [interval] arg is specified, the display 862306a36Sopenharmony_ci# will be refreshed every [interval] seconds. The default interval is 962306a36Sopenharmony_ci# 3 seconds. 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_cifrom __future__ import print_function 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ciimport os, sys, time 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_citry: 1662306a36Sopenharmony_ci import thread 1762306a36Sopenharmony_ciexcept ImportError: 1862306a36Sopenharmony_ci import _thread as thread 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cisys.path.append(os.environ['PERF_EXEC_PATH'] + \ 2162306a36Sopenharmony_ci '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cifrom perf_trace_context import * 2462306a36Sopenharmony_cifrom Core import * 2562306a36Sopenharmony_cifrom Util import * 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ciusage = "perf script -s sctop.py [comm] [interval]\n"; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cifor_comm = None 3062306a36Sopenharmony_cidefault_interval = 3 3162306a36Sopenharmony_ciinterval = default_interval 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ciif len(sys.argv) > 3: 3462306a36Sopenharmony_ci sys.exit(usage) 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ciif len(sys.argv) > 2: 3762306a36Sopenharmony_ci for_comm = sys.argv[1] 3862306a36Sopenharmony_ci interval = int(sys.argv[2]) 3962306a36Sopenharmony_cielif len(sys.argv) > 1: 4062306a36Sopenharmony_ci try: 4162306a36Sopenharmony_ci interval = int(sys.argv[1]) 4262306a36Sopenharmony_ci except ValueError: 4362306a36Sopenharmony_ci for_comm = sys.argv[1] 4462306a36Sopenharmony_ci interval = default_interval 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_cisyscalls = autodict() 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_cidef trace_begin(): 4962306a36Sopenharmony_ci thread.start_new_thread(print_syscall_totals, (interval,)) 5062306a36Sopenharmony_ci pass 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cidef raw_syscalls__sys_enter(event_name, context, common_cpu, 5362306a36Sopenharmony_ci common_secs, common_nsecs, common_pid, common_comm, 5462306a36Sopenharmony_ci common_callchain, id, args): 5562306a36Sopenharmony_ci if for_comm is not None: 5662306a36Sopenharmony_ci if common_comm != for_comm: 5762306a36Sopenharmony_ci return 5862306a36Sopenharmony_ci try: 5962306a36Sopenharmony_ci syscalls[id] += 1 6062306a36Sopenharmony_ci except TypeError: 6162306a36Sopenharmony_ci syscalls[id] = 1 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cidef syscalls__sys_enter(event_name, context, common_cpu, 6462306a36Sopenharmony_ci common_secs, common_nsecs, common_pid, common_comm, 6562306a36Sopenharmony_ci id, args): 6662306a36Sopenharmony_ci raw_syscalls__sys_enter(**locals()) 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_cidef print_syscall_totals(interval): 6962306a36Sopenharmony_ci while 1: 7062306a36Sopenharmony_ci clear_term() 7162306a36Sopenharmony_ci if for_comm is not None: 7262306a36Sopenharmony_ci print("\nsyscall events for %s:\n" % (for_comm)) 7362306a36Sopenharmony_ci else: 7462306a36Sopenharmony_ci print("\nsyscall events:\n") 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci print("%-40s %10s" % ("event", "count")) 7762306a36Sopenharmony_ci print("%-40s %10s" % 7862306a36Sopenharmony_ci ("----------------------------------------", 7962306a36Sopenharmony_ci "----------")) 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci for id, val in sorted(syscalls.items(), 8262306a36Sopenharmony_ci key = lambda kv: (kv[1], kv[0]), 8362306a36Sopenharmony_ci reverse = True): 8462306a36Sopenharmony_ci try: 8562306a36Sopenharmony_ci print("%-40s %10d" % (syscall_name(id), val)) 8662306a36Sopenharmony_ci except TypeError: 8762306a36Sopenharmony_ci pass 8862306a36Sopenharmony_ci syscalls.clear() 8962306a36Sopenharmony_ci time.sleep(interval) 90