2012-01-06 5 views
3

Linuxで実行されるシステムコールの量を監視する必要があります。 vmstatにはBSDとAIXシステムでこれを表示する機能があるが、Linuxでは(マニュアルページによると)それができないことはわかっている。カーネルによって実行されるsyscallの数を監視する方法は?

/procにはカウンタがありますか?あるいはそれを監視する他の方法はありますか?システムコールをトレースするジェフ・フォスターが言ったように

+0

[straceの](http://linux.die.net/man/1/strace)は '多分-c'? それはこのように出力を生成しますか –

+0

Nit:*カーネル*はシステムコールを実行しません。すでにシステムレベルにあるので、適切な関数を直接呼び出すだけです。ありがとうございます。 –

+0

私は実際に正確にしたい) – Yuri

答えて

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

2

あなたはpstraceを使用することができます。また

、あなたはstraceのを使用してltraceのできる

straceの - トレースシステムコールとシグナル

ltraceの - ライブラリコールトレーサ

+0

私はsyscallsの要約を知る必要がある**すべての**現在OSによって実行されているプロセス。 – Yuri

0

私が一元的に認識していませんよOS全体のシステムコールを監視します。 のプロセスでptraceを実行し、すべての子供に従ってください。しかし、それがうまくいくかどうかはわかりません。

これを行うには、カーネル自体にパッチを書き込むことをお勧めします。これまで私が見てきたことに最も近いのは、実行時にsyscallを実行できる権限を強制するためのcgroup実装です。あなたはここにパッチを見つけることができます:

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

カーネルプログラミングの観点から、そこにカウンターを投げるためにあまりにも多くのより多くの仕事ではありません。

+0

私はstrace -fv -p 1を実行しようとしましたが、それはすべてのプロセスにそのようには付いていないようです。 – Yuri

+0

カーネルにパッチを当てるのを避けるためSystemTapを使用しました。手伝ってくれてありがとう。実際には、/ proc/sys /にはそのようなカウンタがないとは信じられません。彼らがそれを実装しなかった理由を知っている人はいますか? – Yuri

+0

投稿したコードを見る - それらはシステムコールではなく、アプリケーション/プロセスです。 syscallは、setuid、capset、mountなどのユーザランドにエクスポートされるカーネル関数です。リストはhttp://www.kernel.org/doc/man-pages/online/dir_section_2を参照してください。html –

1

私はOProfileがこれを行うことができると信じています。

+0

は私のシステムでOProfileを実行できませんので、私はシンプルなSystemTapスクリプトを書いています。下記を参照してください。 – Yuri

関連する問題