我需要監視Linux執行的系統調用的數量。 我知道vmstat能夠爲BSD和AIX系統顯示此功能,但對於Linux,它不能(根據手冊頁)。如何監視內核執行的系統調用次數?
/proc
有沒有計數器?或者還有其他方法來監控它嗎?
我需要監視Linux執行的系統調用的數量。 我知道vmstat能夠爲BSD和AIX系統顯示此功能,但對於Linux,它不能(根據手冊頁)。如何監視內核執行的系統調用次數?
/proc
有沒有計數器?或者還有其他方法來監控它嗎?
我寫了一個簡單的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)
}
您可以使用pstrace如說傑夫 - 福斯特跟蹤系統調用。
此外,您還可以使用strace的和ltrace
strace的 - 跟蹤系統調用和信號
ltrace - 阿庫調用跟蹤
我的意思是我需要知道syscalls的摘要**當前正在由OS執行的所有**進程。 – Yuri 2012-01-06 12:29:05
我不知道的一種集中的方式來監視整個操作系統中的系統調用。也許在init
的過程中做ptrace
並關注所有的孩子?但我不知道這是否會奏效。
最好的辦法是給內核本身寫一個補丁來做到這一點。最接近我看到的是一個cgroup實現,用於強制執行什麼系統調用可以在運行時執行的權限。你可以在這裏找到補丁:
https://github.com/luksow/syscalls-cgroup
應該不會太大更多的工作扔在櫃檯那裏,從內核編程的角度。
我試圖運行strace -fv -p 1,但它似乎並沒有附加到所有進程的方式。 – Yuri 2012-01-09 08:05:44
以避免修補我使用SystemTap的內核,請參閱我附加的腳本。感謝幫助。實際上,我不能相信/ proc/sys /中沒有這樣的計數器...甚至無法想象爲此的原因。有沒有人知道他們爲什麼沒有實現它? – Yuri 2012-01-09 09:06:11
看看你發佈的代碼 - 那些不是系統調用,那些是應用程序/進程。系統調用是導出到用戶空間的內核函數,如setuid,capset,mount;看到這裏的列表:http://www.kernel.org/doc/man-pages/online/dir_section_2。html – 2012-01-09 15:42:51
[strace的](http://linux.die.net/man/1/strace)'-c'可能? – 2012-01-06 11:54:21
Nit:*內核*不執行任何系統調用 - 它已經在系統級別,因此只是直接調用適當的函數。 – 2012-01-09 10:06:19
謝謝。我真的很想精確) – Yuri 2012-01-10 06:52:05