Linuxで実行されるシステムコールの量を監視する必要があります。 vmstatにはBSDとAIXシステムでこれを表示する機能があるが、Linuxでは(マニュアルページによると)それができないことはわかっている。カーネルによって実行されるsyscallの数を監視する方法は?
/proc
にはカウンタがありますか?あるいはそれを監視する他の方法はありますか?システムコールをトレースするジェフ・フォスターが言ったように
Linuxで実行されるシステムコールの量を監視する必要があります。 vmstatにはBSDとAIXシステムでこれを表示する機能があるが、Linuxでは(マニュアルページによると)それができないことはわかっている。カーネルによって実行されるsyscallの数を監視する方法は?
/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
私が一元的に認識していませんよOS全体のシステムコールを監視します。 のプロセスでptrace
を実行し、すべての子供に従ってください。しかし、それがうまくいくかどうかはわかりません。
これを行うには、カーネル自体にパッチを書き込むことをお勧めします。これまで私が見てきたことに最も近いのは、実行時にsyscallを実行できる権限を強制するためのcgroup実装です。あなたはここにパッチを見つけることができます:
はhttps://github.com/luksow/syscalls-cgroup
カーネルプログラミングの観点から、そこにカウンターを投げるためにあまりにも多くのより多くの仕事ではありません。
私はstrace -fv -p 1を実行しようとしましたが、それはすべてのプロセスにそのようには付いていないようです。 – Yuri
カーネルにパッチを当てるのを避けるためSystemTapを使用しました。手伝ってくれてありがとう。実際には、/ proc/sys /にはそのようなカウンタがないとは信じられません。彼らがそれを実装しなかった理由を知っている人はいますか? – Yuri
投稿したコードを見る - それらはシステムコールではなく、アプリケーション/プロセスです。 syscallは、setuid、capset、mountなどのユーザランドにエクスポートされるカーネル関数です。リストはhttp://www.kernel.org/doc/man-pages/online/dir_section_2を参照してください。html –
[straceの](http://linux.die.net/man/1/strace)は '多分-c'? それはこのように出力を生成しますか –
Nit:*カーネル*はシステムコールを実行しません。すでにシステムレベルにあるので、適切な関数を直接呼び出すだけです。ありがとうございます。 –
私は実際に正確にしたい) – Yuri