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