xref: /OK3568_Linux_fs/kernel/tools/perf/scripts/python/sctop.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun# system call top
2*4882a593Smuzhiyun# (c) 2010, Tom Zanussi <tzanussi@gmail.com>
3*4882a593Smuzhiyun# Licensed under the terms of the GNU GPL License version 2
4*4882a593Smuzhiyun#
5*4882a593Smuzhiyun# Periodically displays system-wide system call totals, broken down by
6*4882a593Smuzhiyun# syscall.  If a [comm] arg is specified, only syscalls called by
7*4882a593Smuzhiyun# [comm] are displayed. If an [interval] arg is specified, the display
8*4882a593Smuzhiyun# will be refreshed every [interval] seconds.  The default interval is
9*4882a593Smuzhiyun# 3 seconds.
10*4882a593Smuzhiyun
11*4882a593Smuzhiyunfrom __future__ import print_function
12*4882a593Smuzhiyun
13*4882a593Smuzhiyunimport os, sys, time
14*4882a593Smuzhiyun
15*4882a593Smuzhiyuntry:
16*4882a593Smuzhiyun	import thread
17*4882a593Smuzhiyunexcept ImportError:
18*4882a593Smuzhiyun	import _thread as thread
19*4882a593Smuzhiyun
20*4882a593Smuzhiyunsys.path.append(os.environ['PERF_EXEC_PATH'] + \
21*4882a593Smuzhiyun	'/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
22*4882a593Smuzhiyun
23*4882a593Smuzhiyunfrom perf_trace_context import *
24*4882a593Smuzhiyunfrom Core import *
25*4882a593Smuzhiyunfrom Util import *
26*4882a593Smuzhiyun
27*4882a593Smuzhiyunusage = "perf script -s sctop.py [comm] [interval]\n";
28*4882a593Smuzhiyun
29*4882a593Smuzhiyunfor_comm = None
30*4882a593Smuzhiyundefault_interval = 3
31*4882a593Smuzhiyuninterval = default_interval
32*4882a593Smuzhiyun
33*4882a593Smuzhiyunif len(sys.argv) > 3:
34*4882a593Smuzhiyun	sys.exit(usage)
35*4882a593Smuzhiyun
36*4882a593Smuzhiyunif len(sys.argv) > 2:
37*4882a593Smuzhiyun	for_comm = sys.argv[1]
38*4882a593Smuzhiyun	interval = int(sys.argv[2])
39*4882a593Smuzhiyunelif len(sys.argv) > 1:
40*4882a593Smuzhiyun	try:
41*4882a593Smuzhiyun		interval = int(sys.argv[1])
42*4882a593Smuzhiyun	except ValueError:
43*4882a593Smuzhiyun		for_comm = sys.argv[1]
44*4882a593Smuzhiyun		interval = default_interval
45*4882a593Smuzhiyun
46*4882a593Smuzhiyunsyscalls = autodict()
47*4882a593Smuzhiyun
48*4882a593Smuzhiyundef trace_begin():
49*4882a593Smuzhiyun	thread.start_new_thread(print_syscall_totals, (interval,))
50*4882a593Smuzhiyun	pass
51*4882a593Smuzhiyun
52*4882a593Smuzhiyundef raw_syscalls__sys_enter(event_name, context, common_cpu,
53*4882a593Smuzhiyun	common_secs, common_nsecs, common_pid, common_comm,
54*4882a593Smuzhiyun	common_callchain, id, args):
55*4882a593Smuzhiyun	if for_comm is not None:
56*4882a593Smuzhiyun		if common_comm != for_comm:
57*4882a593Smuzhiyun			return
58*4882a593Smuzhiyun	try:
59*4882a593Smuzhiyun		syscalls[id] += 1
60*4882a593Smuzhiyun	except TypeError:
61*4882a593Smuzhiyun		syscalls[id] = 1
62*4882a593Smuzhiyun
63*4882a593Smuzhiyundef syscalls__sys_enter(event_name, context, common_cpu,
64*4882a593Smuzhiyun	common_secs, common_nsecs, common_pid, common_comm,
65*4882a593Smuzhiyun	id, args):
66*4882a593Smuzhiyun	raw_syscalls__sys_enter(**locals())
67*4882a593Smuzhiyun
68*4882a593Smuzhiyundef print_syscall_totals(interval):
69*4882a593Smuzhiyun	while 1:
70*4882a593Smuzhiyun		clear_term()
71*4882a593Smuzhiyun		if for_comm is not None:
72*4882a593Smuzhiyun			print("\nsyscall events for %s:\n" % (for_comm))
73*4882a593Smuzhiyun		else:
74*4882a593Smuzhiyun			print("\nsyscall events:\n")
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun		print("%-40s  %10s" % ("event", "count"))
77*4882a593Smuzhiyun		print("%-40s  %10s" %
78*4882a593Smuzhiyun			("----------------------------------------",
79*4882a593Smuzhiyun			"----------"))
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun		for id, val in sorted(syscalls.items(),
82*4882a593Smuzhiyun				key = lambda kv: (kv[1], kv[0]),
83*4882a593Smuzhiyun				reverse = True):
84*4882a593Smuzhiyun			try:
85*4882a593Smuzhiyun				print("%-40s  %10d" % (syscall_name(id), val))
86*4882a593Smuzhiyun			except TypeError:
87*4882a593Smuzhiyun				pass
88*4882a593Smuzhiyun		syscalls.clear()
89*4882a593Smuzhiyun		time.sleep(interval)
90