2010-04-01 23:59:23 -05:00
# system call top
# (c) 2010, Tom Zanussi <tzanussi@gmail.com>
# Licensed under the terms of the GNU GPL License version 2
#
# Periodically displays system-wide system call totals, broken down by
# syscall. If a [comm] arg is specified, only syscalls called by
# [comm] are displayed. If an [interval] arg is specified, the display
# will be refreshed every [interval] seconds. The default interval is
# 3 seconds.
2019-02-22 15:06:14 -08:00
from __future__ import print_function
import os , sys , time
try :
2019-03-01 17:18:57 -08:00
import thread
2019-02-22 15:06:14 -08:00
except ImportError :
2019-03-01 17:18:57 -08:00
import _thread as thread
2010-04-01 23:59:23 -05:00
sys . path . append ( os . environ [ ' PERF_EXEC_PATH ' ] + \
' /scripts/python/Perf-Trace-Util/lib/Perf/Trace ' )
from perf_trace_context import *
from Core import *
from Util import *
2010-12-23 13:10:22 -02:00
usage = " perf script -s sctop.py [comm] [interval] \n " ;
2010-04-01 23:59:23 -05:00
for_comm = None
default_interval = 3
interval = default_interval
if len ( sys . argv ) > 3 :
sys . exit ( usage )
if len ( sys . argv ) > 2 :
for_comm = sys . argv [ 1 ]
interval = int ( sys . argv [ 2 ] )
elif len ( sys . argv ) > 1 :
try :
interval = int ( sys . argv [ 1 ] )
except ValueError :
for_comm = sys . argv [ 1 ]
interval = default_interval
syscalls = autodict ( )
def trace_begin ( ) :
thread . start_new_thread ( print_syscall_totals , ( interval , ) )
pass
def raw_syscalls__sys_enter ( event_name , context , common_cpu ,
common_secs , common_nsecs , common_pid , common_comm ,
2014-07-10 13:50:51 +02:00
common_callchain , id , args ) :
2010-04-01 23:59:23 -05:00
if for_comm is not None :
if common_comm != for_comm :
return
try :
syscalls [ id ] + = 1
except TypeError :
syscalls [ id ] = 1
2014-06-11 16:09:08 -03:00
def syscalls__sys_enter ( event_name , context , common_cpu ,
common_secs , common_nsecs , common_pid , common_comm ,
id , args ) :
raw_syscalls__sys_enter ( * * locals ( ) )
2010-04-01 23:59:23 -05:00
def print_syscall_totals ( interval ) :
while 1 :
clear_term ( )
if for_comm is not None :
2019-02-22 15:06:14 -08:00
print ( " \n syscall events for %s : \n " % ( for_comm ) )
2010-04-01 23:59:23 -05:00
else :
2019-02-22 15:06:14 -08:00
print ( " \n syscall events: \n " )
2010-04-01 23:59:23 -05:00
2019-02-22 15:06:14 -08:00
print ( " %-40s %10s " % ( " event " , " count " ) )
print ( " %-40s %10s " %
2019-03-01 17:18:57 -08:00
( " ---------------------------------------- " ,
" ---------- " ) )
2010-04-01 23:59:23 -05:00
2019-03-01 17:18:57 -08:00
for id , val in sorted ( syscalls . items ( ) ,
key = lambda kv : ( kv [ 1 ] , kv [ 0 ] ) ,
reverse = True ) :
2010-04-01 23:59:23 -05:00
try :
2019-02-22 15:06:14 -08:00
print ( " %-40s %10d " % ( syscall_name ( id ) , val ) )
2010-04-01 23:59:23 -05:00
except TypeError :
pass
syscalls . clear ( )
time . sleep ( interval )