2012-01-06 71 views
3

我需要監視Linux執行的系統調用的數量。 我知道vmstat能夠爲BSD和AIX系統顯示此功能,但對於Linux,它不能(根據手冊頁)。如何監視內核執行的系統調用次數?

/proc有沒有計數器?或者還有其他方法來監控它嗎?

+0

[strace的](http://linux.die.net/man/1/strace)'-c'可能? – 2012-01-06 11:54:21

+0

Nit:*內核*不執行任何系統調用 - 它已經在系統級別,因此只是直接調用適當的函數。 – 2012-01-09 10:06:19

+0

謝謝。我真的很想精確) – Yuri 2012-01-10 06:52:05

回答

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

您可以使用ptrace監控所有系統調用(見here

+0

我認爲編寫自定義應用程序對於這個任務來說有點複雜,而且ptrace()並不是那麼輕量級,尤其是對系統中的所有進程運行時 – Yuri 2012-01-06 12:34:32

2

您可以使用pstrace如說傑夫 - 福斯特跟蹤系統調用。

此外,您還可以使用strace的和ltrace

strace的 - 跟蹤系統調用和信號

ltrace - 阿庫調用跟蹤

+0

我的意思是我需要知道syscalls的摘要**當前正在由OS執行的所有**進程。 – Yuri 2012-01-06 12:29:05

0

我不知道的一種集中的方式來監視整個操作系統中的系統調用。也許在init的過程中做ptrace並關注所有的孩子?但我不知道這是否會奏效。

最好的辦法是給內核本身寫一個補丁來做到這一點。最接近我看到的是一個cgroup實現,用於強制執行什麼系統調用可以在運行時執行的權限。你可以在這裏找到補丁:

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

應該不會太大更多的工作扔在櫃檯那裏,從內核編程的角度。

+0

我試圖運行strace -fv -p 1,但它似乎並沒有附加到所有進程的方式。 – Yuri 2012-01-09 08:05:44

+0

以避免修補我使用SystemTap的內核,請參閱我附加的腳本。感謝幫助。實際上,我不能相信/ proc/sys /中沒有這樣的計數器...甚至無法想象爲此的原因。有沒有人知道他們爲什麼沒有實現它? – Yuri 2012-01-09 09:06:11

+0

看看你發佈的代碼 - 那些不是系統調用,那些是應用程序/進程。系統調用是導出到用戶空間的內核函數,如setuid,capset,mount;看到這裏的列表:http://www.kernel.org/doc/man-pages/online/dir_section_2。html – 2012-01-09 15:42:51

1

我相信OProfile可以做到這一點。

+0

無法在我的系統上運行OProfile,因此我編寫了一個簡單的SystemTap腳本,請參見下文。 – Yuri 2012-01-09 08:09:12