1*4d161f03STom Zanussi# system call counts, by pid 2*4d161f03STom Zanussi# (c) 2010, Tom Zanussi <[email protected]> 3*4d161f03STom Zanussi# Licensed under the terms of the GNU GPL License version 2 4*4d161f03STom Zanussi# 5*4d161f03STom Zanussi# Displays system-wide system call totals, broken down by syscall. 6*4d161f03STom Zanussi# If a [comm] arg is specified, only syscalls called by [comm] are displayed. 7*4d161f03STom Zanussi 8*4d161f03STom Zanussiimport os 9*4d161f03STom Zanussiimport sys 10*4d161f03STom Zanussi 11*4d161f03STom Zanussisys.path.append(os.environ['PERF_EXEC_PATH'] + \ 12*4d161f03STom Zanussi '/scripts/python/Perf-Trace-Util/lib/Perf/Trace') 13*4d161f03STom Zanussi 14*4d161f03STom Zanussifrom perf_trace_context import * 15*4d161f03STom Zanussifrom Core import * 16*4d161f03STom Zanussi 17*4d161f03STom Zanussiusage = "perf trace -s syscall-counts-by-pid.py [comm]\n"; 18*4d161f03STom Zanussi 19*4d161f03STom Zanussifor_comm = None 20*4d161f03STom Zanussi 21*4d161f03STom Zanussiif len(sys.argv) > 2: 22*4d161f03STom Zanussi sys.exit(usage) 23*4d161f03STom Zanussi 24*4d161f03STom Zanussiif len(sys.argv) > 1: 25*4d161f03STom Zanussi for_comm = sys.argv[1] 26*4d161f03STom Zanussi 27*4d161f03STom Zanussisyscalls = autodict() 28*4d161f03STom Zanussi 29*4d161f03STom Zanussidef trace_begin(): 30*4d161f03STom Zanussi pass 31*4d161f03STom Zanussi 32*4d161f03STom Zanussidef trace_end(): 33*4d161f03STom Zanussi print_syscall_totals() 34*4d161f03STom Zanussi 35*4d161f03STom Zanussidef raw_syscalls__sys_enter(event_name, context, common_cpu, 36*4d161f03STom Zanussi common_secs, common_nsecs, common_pid, common_comm, 37*4d161f03STom Zanussi id, args): 38*4d161f03STom Zanussi if for_comm is not None: 39*4d161f03STom Zanussi if common_comm != for_comm: 40*4d161f03STom Zanussi return 41*4d161f03STom Zanussi try: 42*4d161f03STom Zanussi syscalls[common_comm][common_pid][id] += 1 43*4d161f03STom Zanussi except TypeError: 44*4d161f03STom Zanussi syscalls[common_comm][common_pid][id] = 1 45*4d161f03STom Zanussi 46*4d161f03STom Zanussidef print_syscall_totals(): 47*4d161f03STom Zanussi if for_comm is not None: 48*4d161f03STom Zanussi print "\nsyscall events for %s:\n\n" % (for_comm), 49*4d161f03STom Zanussi else: 50*4d161f03STom Zanussi print "\nsyscall events by comm/pid:\n\n", 51*4d161f03STom Zanussi 52*4d161f03STom Zanussi print "%-40s %10s\n" % ("comm [pid]/syscalls", "count"), 53*4d161f03STom Zanussi print "%-40s %10s\n" % ("----------------------------------------", \ 54*4d161f03STom Zanussi "----------"), 55*4d161f03STom Zanussi 56*4d161f03STom Zanussi comm_keys = syscalls.keys() 57*4d161f03STom Zanussi for comm in comm_keys: 58*4d161f03STom Zanussi pid_keys = syscalls[comm].keys() 59*4d161f03STom Zanussi for pid in pid_keys: 60*4d161f03STom Zanussi print "\n%s [%d]\n" % (comm, pid), 61*4d161f03STom Zanussi id_keys = syscalls[comm][pid].keys() 62*4d161f03STom Zanussi for id, val in sorted(syscalls[comm][pid].iteritems(), \ 63*4d161f03STom Zanussi key = lambda(k, v): (v, k), reverse = True): 64*4d161f03STom Zanussi print " %-38d %10d\n" % (id, val), 65