読者です 読者をやめる 読者になる 読者になる

ksaitoの日記

日々試したことの覚え書き

MacのdtraceでディスクI/Oの多いプロセスを特定する

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のインデックスを作成しているプロセスのようです。