147902f36STom Zanussi# system call top 247902f36STom Zanussi# (c) 2010, Tom Zanussi <tzanussi@gmail.com> 347902f36STom Zanussi# Licensed under the terms of the GNU GPL License version 2 447902f36STom Zanussi# 547902f36STom Zanussi# Periodically displays system-wide system call totals, broken down by 647902f36STom Zanussi# syscall. If a [comm] arg is specified, only syscalls called by 747902f36STom Zanussi# [comm] are displayed. If an [interval] arg is specified, the display 847902f36STom Zanussi# will be refreshed every [interval] seconds. The default interval is 947902f36STom Zanussi# 3 seconds. 1047902f36STom Zanussi 11ee75a896STony Jonesfrom __future__ import print_function 12ee75a896STony Jones 13ee75a896STony Jonesimport os, sys, time 14ee75a896STony Jones 15ee75a896STony Jonestry: 16ee75a896STony Jones import thread 17ee75a896STony Jonesexcept ImportError: 18ee75a896STony Jones import _thread as thread 1947902f36STom Zanussi 2047902f36STom Zanussisys.path.append(os.environ['PERF_EXEC_PATH'] + \ 2147902f36STom Zanussi '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') 2247902f36STom Zanussi 2347902f36STom Zanussifrom perf_trace_context import * 2447902f36STom Zanussifrom Core import * 2547902f36STom Zanussifrom Util import * 2647902f36STom Zanussi 27765532c8SArnaldo Carvalho de Melousage = "perf script -s sctop.py [comm] [interval]\n"; 2847902f36STom Zanussi 2947902f36STom Zanussifor_comm = None 3047902f36STom Zanussidefault_interval = 3 3147902f36STom Zanussiinterval = default_interval 3247902f36STom Zanussi 3347902f36STom Zanussiif len(sys.argv) > 3: 3447902f36STom Zanussi sys.exit(usage) 3547902f36STom Zanussi 3647902f36STom Zanussiif len(sys.argv) > 2: 3747902f36STom Zanussi for_comm = sys.argv[1] 3847902f36STom Zanussi interval = int(sys.argv[2]) 3947902f36STom Zanussielif len(sys.argv) > 1: 4047902f36STom Zanussi try: 4147902f36STom Zanussi interval = int(sys.argv[1]) 4247902f36STom Zanussi except ValueError: 4347902f36STom Zanussi for_comm = sys.argv[1] 4447902f36STom Zanussi interval = default_interval 4547902f36STom Zanussi 4647902f36STom Zanussisyscalls = autodict() 4747902f36STom Zanussi 4847902f36STom Zanussidef trace_begin(): 4947902f36STom Zanussi thread.start_new_thread(print_syscall_totals, (interval,)) 5047902f36STom Zanussi pass 5147902f36STom Zanussi 5247902f36STom Zanussidef raw_syscalls__sys_enter(event_name, context, common_cpu, 5347902f36STom Zanussi common_secs, common_nsecs, common_pid, common_comm, 540f5f5bcdSJoseph Schuchart common_callchain, id, args): 5547902f36STom Zanussi if for_comm is not None: 5647902f36STom Zanussi if common_comm != for_comm: 5747902f36STom Zanussi return 5847902f36STom Zanussi try: 5947902f36STom Zanussi syscalls[id] += 1 6047902f36STom Zanussi except TypeError: 6147902f36STom Zanussi syscalls[id] = 1 6247902f36STom Zanussi 6307100877SDaniel Bristot de Oliveiradef syscalls__sys_enter(event_name, context, common_cpu, 6407100877SDaniel Bristot de Oliveira common_secs, common_nsecs, common_pid, common_comm, 6507100877SDaniel Bristot de Oliveira id, args): 6607100877SDaniel Bristot de Oliveira raw_syscalls__sys_enter(**locals()) 6707100877SDaniel Bristot de Oliveira 6847902f36STom Zanussidef print_syscall_totals(interval): 6947902f36STom Zanussi while 1: 7047902f36STom Zanussi clear_term() 7147902f36STom Zanussi if for_comm is not None: 72ee75a896STony Jones print("\nsyscall events for %s:\n" % (for_comm)) 7347902f36STom Zanussi else: 74ee75a896STony Jones print("\nsyscall events:\n") 7547902f36STom Zanussi 76ee75a896STony Jones print("%-40s %10s" % ("event", "count")) 77ee75a896STony Jones print("%-40s %10s" % 78ee75a896STony Jones ("----------------------------------------", 79ee75a896STony Jones "----------")) 8047902f36STom Zanussi 81b504d7f6STony Jones for id, val in sorted(syscalls.items(), 82b504d7f6STony Jones key = lambda kv: (kv[1], kv[0]), 8347902f36STom Zanussi reverse = True): 8447902f36STom Zanussi try: 85ee75a896STony Jones print("%-40s %10d" % (syscall_name(id), val)) 8647902f36STom Zanussi except TypeError: 8747902f36STom Zanussi pass 8847902f36STom Zanussi syscalls.clear() 8947902f36STom Zanussi time.sleep(interval) 90