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

Linux 如何监控内核执行的系统调用数?,linux,statistics,kernel,monitoring,system-calls,Linux,Statistics,Kernel,Monitoring,System Calls,我需要监视Linux执行的系统调用量。 我知道vmstat能够在BSD和AIX系统中显示这一点,但在Linux中却不能(根据手册页) /proc中是否有计数器?或者有其他方法来监视它吗?您可以使用ptrace来监视所有系统调用(请参阅)您可以使用杰夫·福斯特所说的pstrace来跟踪系统调用 此外,还可以使用strace和ltrace strace-跟踪系统调用和信号 ltrace-库调用跟踪器我不知道有一种集中式方法可以监视整个操作系统中的系统调用。可能在init过程中执行ptrace,然后跟

我需要监视Linux执行的系统调用量。 我知道vmstat能够在BSD和AIX系统中显示这一点,但在Linux中却不能(根据手册页)


/proc
中是否有计数器?或者有其他方法来监视它吗?

您可以使用
ptrace
来监视所有系统调用(请参阅)

您可以使用杰夫·福斯特所说的pstrace来跟踪系统调用

此外,还可以使用strace和ltrace

strace-跟踪系统调用和信号


ltrace-库调用跟踪器

我不知道有一种集中式方法可以监视整个操作系统中的系统调用。可能在
init
过程中执行
ptrace
,然后跟踪所有子项?但我不知道这是否有效

最好的办法是为内核本身编写一个补丁来实现这一点。我见过的最接近这一点的是一个cgroup实现,用于对运行时可以执行的系统调用强制执行权限。您可以在此处找到修补程序:


从内核编程的角度来看,在其中添加一个计数器应该不会有太多的工作。

我相信可以做到这一点。

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

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)
}

-c
可能?Nit:内核不执行任何系统调用-它已经处于系统级别,因此只直接调用相应的函数。谢谢。我真的很想准确地说)我的意思是我需要知道操作系统当前正在执行的所有进程的系统调用摘要。我认为编写自定义应用程序对于这个任务来说有点复杂,而且ptrace()并不是那么轻量级,特别是在系统中针对所有进程运行时我尝试运行strace-fv-p1,但它似乎并没有以这种方式连接到所有进程。为了避免修补我使用SystemTap的内核,请参阅我附加的脚本。谢谢你的帮助。实际上,我不敢相信在/proc/sys/中没有这样的计数器。。。我甚至无法想象这样做的原因。有人知道为什么他们没有实现它吗?看看你发布的代码-那些不是系统调用,那些是应用程序/进程。系统调用是导出到userland的内核函数,例如setuid、capset、mount;请参见此处以获取列表:在显示的第一列应用程序名称中,在第二列中-这些应用程序调用的系统调用数(不指定这些系统调用的名称)。无法在我的系统上运行OProfile,因此我编写了一个简单的SystemTap脚本,请参见下文。