sctop.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. import thread
  11. import time
  12. import os
  13. import sys
  14. sys.path.append(os.environ['PERF_EXEC_PATH'] + \
  15. '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')
  16. from perf_trace_context import *
  17. from Core import *
  18. from Util import *
  19. usage = "perf trace -s syscall-counts.py [comm] [interval]\n";
  20. for_comm = None
  21. default_interval = 3
  22. interval = default_interval
  23. if len(sys.argv) > 3:
  24. sys.exit(usage)
  25. if len(sys.argv) > 2:
  26. for_comm = sys.argv[1]
  27. interval = int(sys.argv[2])
  28. elif len(sys.argv) > 1:
  29. try:
  30. interval = int(sys.argv[1])
  31. except ValueError:
  32. for_comm = sys.argv[1]
  33. interval = default_interval
  34. syscalls = autodict()
  35. def trace_begin():
  36. thread.start_new_thread(print_syscall_totals, (interval,))
  37. pass
  38. def raw_syscalls__sys_enter(event_name, context, common_cpu,
  39. common_secs, common_nsecs, common_pid, common_comm,
  40. id, args):
  41. if for_comm is not None:
  42. if common_comm != for_comm:
  43. return
  44. try:
  45. syscalls[id] += 1
  46. except TypeError:
  47. syscalls[id] = 1
  48. def print_syscall_totals(interval):
  49. while 1:
  50. clear_term()
  51. if for_comm is not None:
  52. print "\nsyscall events for %s:\n\n" % (for_comm),
  53. else:
  54. print "\nsyscall events:\n\n",
  55. print "%-40s %10s\n" % ("event", "count"),
  56. print "%-40s %10s\n" % ("----------------------------------------", \
  57. "----------"),
  58. for id, val in sorted(syscalls.iteritems(), key = lambda(k, v): (v, k), \
  59. reverse = True):
  60. try:
  61. print "%-40d %10d\n" % (id, val),
  62. except TypeError:
  63. pass
  64. syscalls.clear()
  65. time.sleep(interval)