如何监控内核执行的系统调用次数?

时间:2012-01-06 11:44:19

标签: linux statistics kernel monitoring system-calls

我需要监控Linux执行的系统调用量。 我知道vmstat能够为BSD和AIX系统显示它,但是对于Linux它不能(根据手册页)。

/proc中是否有任何计数器?或者有没有其他方法来监控它?

5 个答案:

答案 0 :(得分:5)

我写了一个简单的SystemTap脚本(基于syscalls_by_pid.stp)。 它产生如下输出:

ProcessName          #SysCalls

munin-graph          38609 
munin-cron           8160  
fping                4502  
check_http_demo      2584  
check_nrpe           2045  
sh                   1836  
nagios               886   
sendmail             747   
smokeping            649   
check_http           571   
check_nt             376   
pcscd                216   
ping                 108   
check_ping           100   
crond                87    
stapio               69    
init                 56    
syslog-ng            27    
sshd                 17    
ntpd                 9     
hp-asrd              8     
hald-addon-stor      7     
automount            6     
httpd                4     
stap                 3     
flow-capture         2     
gam_server           2     

Total                61686

脚本本身:

#! /usr/bin/env stap

#
# Print the system call count by process name in descending order.
#

global syscalls

probe begin {
  print ("Collecting data... Type Ctrl-C to exit and display results\n")
}

probe syscall.* {
  syscalls[execname()]++
}

probe end {
  printf ("%-20s %-s\n\n", "ProcessName", "#SysCalls")
  summary = 0
  foreach (procname in syscalls-) {
    printf("%-20s %-10d\n", procname, syscalls[procname])
    summary = summary + syscalls[procname]
  }
  printf ("\n%-20s %-d\n", "Total", summary)
}

答案 1 :(得分:2)

您可以使用 pstrace 作为Jeff Foster跟踪系统调用。

此外,您可以使用strace和ltrace

strace - 跟踪系统调用和信号

ltrace - 库调用跟踪器

答案 2 :(得分:1)

您可以使用ptrace监控所有系统调用(请参阅here

答案 3 :(得分:1)

我相信OProfile可以做到这一点。

答案 4 :(得分:0)

我不知道在整个操作系统中监控系统调用的集中方式。也许在ptrace流程上执行init并关注所有孩子?但我不知道这是否有效。

最好的办法是给内核写一个补丁来做到这一点。我见过的最接近这个的是一个cgroup实现,用于强制执行在运行时可以执行的syscalls的权限。你可以在这里找到补丁:

https://github.com/luksow/syscalls-cgroup

从内核编程的角度来看,在那里抛出一个计数器应该不会太多。