我需要监控Linux执行的系统调用量。 我知道vmstat能够为BSD和AIX系统显示它,但是对于Linux它不能(根据手册页)。
/proc
中是否有任何计数器?或者有没有其他方法来监控它?
答案 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
从内核编程的角度来看,在那里抛出一个计数器应该不会太多。