MacでDtraceを使ってみる

日常で Mac を使っていないので、どんな環境なのか?と確認してみました。


$ dtrace -V
dtrace: Sun D 1.6.2
と普通に入っています。ちなみに、Solaris11Express上には 1.6.3 が入っていました。


○DTraceToolkit は?

Solaris系であれば、/opt/DTT などDTTディレクトリに保存されています。
Macは、というと普通に/usr/bin のコマンドでいくつかは使われているようです。


$ grep -l dtrace /usr/bin/*
/usr/bin/bitesize.d
/usr/bin/clang
/usr/bin/cpuwalk.d
/usr/bin/creatbyproc.d
/usr/bin/dappprof
/usr/bin/dapptrace
/usr/bin/diskhits
/usr/bin/dispqlen.d
/usr/bin/dtruss
/usr/bin/errinfo
/usr/bin/execsnoop
/usr/bin/fddist
/usr/bin/filebyproc.d
/usr/bin/hotspot.d
/usr/bin/httpdstat.d
/usr/bin/iofile.d
/usr/bin/iofileb.d
/usr/bin/iopattern
/usr/bin/iopending
/usr/bin/iosnoop
/usr/bin/iotop
...

perlの場合


$ /usr/bin/perl -V:usedtrace
usedtrace='UNKNOWN'; # 対応していれば、'define' になります。

/usr/bin/perl はDTrace対応ではないようなので、Solaris同様自前で用意します。

○DTrace対応perlをインストールする


$ tar xf perl-5.12.3.tar.gz
$ cd perl-5.12.3
$ ./Configure -des -Duse64bitint -Dusedtrace
...

perlbrewで入れる場合


$ perlbrew install perl-5.12.3 -D=use64bitint -D=usedtrace

Solarisの場合は、"-D=useshrplib" をつけないとうまく拾えなかったのですが、Mac上だといらないようです。(もちろんあっても大丈夫)

○DTraceToolkit


$ wget http://www.brendangregg.com/DTraceToolkit-0.99.tar.gz
$ tar xf DTraceToolkit-0.99.tar.gz
$ cd DTraceToolkit-0.99
$ ls Perl
Readme pl_cpudist.d pl_flowinfo.d pl_subcalls.d pl_who.d
pl_calldist.d pl_cputime.d pl_flowtime.d pl_syscalls.d
pl_calltime.d pl_flow.d pl_malloc.d pl_syscolors.d


Tatsumaki で試してみる


$ cpanm --look Tatsumaki
$ cd eg/chat/
$ plackup
Twiggy: Accepting connections at http://0.0.0.0:5000/
...

アクセス


curl http://localhost:5000/chat/test


$ sudo ./pl_flow.d
C PID DELTA(us) FILE:LINE -- SUB
...
1 237 30 Tatsumaki/Handler.pm:29 -> prepare
1 237 28 Tatsumaki/Handler.pm:29 <- prepare
1 237 33 app.psgi:81 -> get
1 237 18 Tatsumaki/Handler.pm:234 -> render
1 237 38 Mouse/Meta/Method/Delegation.pm:35 -> render_file
1 237 45 Mouse/Meta/Method/Delegation.pm:35 -> render_file
1 237 47 Text/MicroTemplate/File.pm:94 -> render_file
1 237 37 Text/MicroTemplate/File.pm:48 -> build_file
...

この辺りは無難に動いてくれました。