1e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# system call top
2e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# (c) 2010, Tom Zanussi <tzanussi@gmail.com>
3e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# Licensed under the terms of the GNU GPL License version 2
4e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#
5e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# Periodically displays system-wide system call totals, broken down by
6e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# syscall.  If a [comm] arg is specified, only syscalls called by
7e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# [comm] are displayed. If an [interval] arg is specified, the display
8e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# will be refreshed every [interval] seconds.  The default interval is
9e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng# 3 seconds.
10e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
11e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengimport os, sys, thread, time
12e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
13e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsys.path.append(os.environ['PERF_EXEC_PATH'] + \
14e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
15e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
16e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengfrom perf_trace_context import *
17e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengfrom Core import *
18e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengfrom Util import *
19e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
20e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengusage = "perf script -s sctop.py [comm] [interval]\n";
21e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
22e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengfor_comm = None
23e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengdefault_interval = 3
24e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chenginterval = default_interval
25e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
26e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengif len(sys.argv) > 3:
27e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	sys.exit(usage)
28e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
29e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengif len(sys.argv) > 2:
30e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	for_comm = sys.argv[1]
31e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	interval = int(sys.argv[2])
32e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengelif len(sys.argv) > 1:
33e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	try:
34e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		interval = int(sys.argv[1])
35e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	except ValueError:
36e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		for_comm = sys.argv[1]
37e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		interval = default_interval
38e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
39e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsyscalls = autodict()
40e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
41e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengdef trace_begin():
42e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	thread.start_new_thread(print_syscall_totals, (interval,))
43e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	pass
44e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
45e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengdef raw_syscalls__sys_enter(event_name, context, common_cpu,
46e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	common_secs, common_nsecs, common_pid, common_comm,
47e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	id, args):
48e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	if for_comm is not None:
49e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		if common_comm != for_comm:
50e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng			return
51e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	try:
52e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		syscalls[id] += 1
53e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	except TypeError:
54e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		syscalls[id] = 1
55e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
56e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengdef print_syscall_totals(interval):
57e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng	while 1:
58e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		clear_term()
59e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		if for_comm is not None:
60e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng			print "\nsyscall events for %s:\n\n" % (for_comm),
61e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		else:
62e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng			print "\nsyscall events:\n\n",
63e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
64e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		print "%-40s  %10s\n" % ("event", "count"),
65e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		print "%-40s  %10s\n" % ("----------------------------------------", \
66e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng						 "----------"),
67e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng
68e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		for id, val in sorted(syscalls.iteritems(), key = lambda(k, v): (v, k), \
69e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng					      reverse = True):
70e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng			try:
71e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng				print "%-40s  %10d\n" % (syscall_name(id), val),
72e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng			except TypeError:
73e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng				pass
74e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		syscalls.clear()
75e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng		time.sleep(interval)
76