dtraceは、Solaris10で開発された仕組みですが、Mac OS Xにも移植されています。
アプリケーション側の設定不要で動的にシステム情報を取得することができます。
提供されているプローブ
プローブと呼ばれるシステム情報を収集するポイントがあります。
OS X 10.8.2では、183,198個のプローブが提供されています。
$ sudo dtrace -l > dtracelist.txt $ wc -l dtracelist.txt 184198 dtracelist.txt $
フィアルI/Oの多いプロセスを特定
ファイルの読み書きは、以下のプローブで情報が提供されます。
$ grep syscall dtracelist.txt | egrep " read return| write return" 138 syscall read return 140 syscall write return $
fileio.dというファイルにDスクリプトというawkライクなスクリプトを書いて、read/writeそれぞれのプローブで読み書きしているデータのサイズを表示します。
$ cat fileio.d
#!/usr/sbin/dtrace -s
syscall::read:return
/arg0 > 0/ {
@readbytes[execname] = sum(arg0);
}
syscall::write:return
/arg0 > 0/ {
@writebytes[execname] = sum(arg0);
}
dtrace:::END {
printf("\n=== read ===");
printa(@readbytes);
printf("=== write ===");
printa(@writebytes);
}
$ sudo ./fileio.d
dtrace: script './fileio.d' matched 3 probes
^C
CPU ID FUNCTION:NAME
0 2 :END
=== read ===
launchd 4
Terminal 5
configd 164
fseventsd 158289
mds 158289
mdworker 13284433
=== write ===
Terminal 2
launchd 4
syslogd 110
configd 128
$
mdworkerというプロセスが大量にデータを読んでいますがSpotlightのインデックスを作成しているプロセスのようです。