Rubyからロードされて実行される拡張ライブラリの処理をプロファイルする方法です。
(gprofなどの一般的な方法は、拡張ライブラリ内の処理まではプロファイルしてくれません)
現状、プロファイルできることが判明しているのは、oprofileとgoogle-perftoolsです。
どちらもubuntuならaptで簡単にinstallできました。
oprofile
システム全体のプロファイリングを目的としているものなので、まわりで動いているプロセスも全部プロファイルされてしまいます。
また、カーネル側の設定によっては使えないので、クラウド系サービスなどの環境でカーネル設定を変更できない場合は使えません。
$ sudo opcontrol --reset
$ sudo opcontrol --start
$ ruby load-ext.rb
$ sudo opcontrol --shutdown
$ opreport -l
google-perftools
私としては、こちらがお勧めです。
下記の方法で、サンプリングによる関数呼び出しのプロファイル結果が出ます。
$ LD_PRELOAD=/usr/lib/libprofiler.so CPUPROFILE=./profile.out ruby load-ext.rb
$ google-pprof --text /usr/bin/ruby ./profile.out_5941
5941はプロセスIDです。
プロファイル絡みでは、これ以外にヒープのメモリリークチェックやプロファイル結果のグラフ化などができます。
0 件のコメント:
コメントを投稿