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