ページ

2011年8月3日水曜日

Rubyの拡張ライブラリのプロファイルをとる方法メモ



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 件のコメント:

コメントを投稿