Y-110's Wiki


[PHPプロファイリング: Xdebug(Xdebug2) + WinCacheGrind]

このページをdel.icio.usに追加 このページをはてなブックマークに追加このページを含むはてなブックマーク このページをlivedoor クリップに追加このページを含むlivedoor クリップ このページをYahoo!ブックマークに追加このページを含むYahoo!ブックマーク

_ Xdebug + WinCacheGrind での簡単 PHP プロファイリング

xdebug は PHP 5 にも対応している, 高機能なデバッガモジュールです。
xdebug にはプロファイリング機能も備わっていて, スクリプトのボトルネック調査には非常に有用です。

ただ, xdebug 単体だとプロファイリングの結果を表示する機能はサポートされていないため, 別途プロファイル結果表示用のツールを使う必要があります。
Windows上で動作する WinCacheGrind というプロファイル結果表示ツールがありますので, これと組み合わせることで快適なプロファイリング環境が整います。

_ xdebug の入手

Xdebug の公式サイトからアーカイブを入手します。
現時点(2006/5/26)での最新版は, 2.0.0beta5 です。

Linux ではソースをダウンロードしてコンパイルします。
または, PECL経由で pecl install xdebug でインストールすることも可能です。*1

Windows は PHP のバージョン毎にモジュールが用意されているので, 解凍した DLL を extension_dir にコピーすれば OK です。

_ WinCacheGrind の入手

SourceForge:WinCacheGrind から最新パッケージをダウンロードします。
後は, ダウンロードした exeファイルを実行してインストールするだけです。

_ php.ini の設定

xdebug モジュールを読み込んでプロファイリングに関する項目を設定します。

extension=xdebug-2.0.0beta5.dll

xdebug.profiler_enable = 1
xdebug.profiler_output_name = crc32
xdebug.profiler_output_dir = "C:/cygwin/tmp/xdebug"

出力されるプロファイル名は cachegrind.out.xxx で, xdebug.profiler_output_dir で指定したディレクトリに出力されます。
xdebug.profiler_output_name が crc32 だと xxx が作業ディレクトリの crc32 ハッシュとなり, crc32 以外だと PHP のプロセスIDとなります。*2
プロファイルを保存するディレクトリには, PHP実行ユーザの書込み権限を与えておくのを忘れないように。

PHP を Apacheモジュールとして利用しているなら, Apache の再起動を行って下さい。
後はプログラムを実行すれば, 指定したディレクトリにプロファイルが生成されます。

_ プロファイル結果表示

プロファイルの結果を表示するには, WinCacheGrind を起動して生成されたプロファイルを読み込むか D&D するだけです。

wincachegrind.jpg

左のウィンドウには関数のコールスタックがツリー形式で表示されます。
右のウィンドウには選択されたツリー部分(Overall の場合はツリー以下)のプロファイル情報が表示されます。

_ オプション

Tools → Options でオプション設定できます。
フレームワーク等を利用していると, 関数コール数が多くてプロファイルの結果表示が見難くなるので, 重い部分だけを表示するようにします。
Displayタブの Threshold に閾値を入力して, それ以上に時間がかかっている関数だけを表示するようにできます。

wincachegrind2.jpg

右から2番目の ! を有効にすると, 閾値以上に時間がかかっている関数のみを表示します。
一番右にある手のオプションを有効にすると, PHP のネイティブ関数を非表示にできます。
また, 時計 or Σ のトグルオプションを有効にすることで, 時間表示かパーセント表示のどちらかに切り替えられます。

_ Line by Line

Line by Line のタブは, プログラムファイルそのものに対応した表示形式になっています。

Function	関数名。PHPネイティブ関数の場合は php::xxx の形式。
Self	自分自身の実行にかかった時間?なんだろこれ?
Cum.	関数の実行にかかった時間
File	関数が定義されているファイル名
Called from	関数がコールされた場所

関数名をダブルクリックすると階層を辿っていけます。
Cum. が大きい関数を辿ると簡単にボトルネックの箇所までたどり着くことができて便利です。

_ Overall

Overall のタブは, ツリーで選択されている関数以下の情報を総合的に表示します。

Function	関数名。PHPネイティブ関数の場合は php::xxx の形式。
Avg.Self	自分自身の実行にかかった時間の平均?
Avg.Cum.	関数の実行にかかった平均時間
Total Self	Avg.Self のトータル?	
Total Cum.	関数の実行にかかった総合時間
Calls	関数コールの回数

Overall のタブでは, 関数コールの回数や平均時間, 総合時間などの情報を知ることができます。
関数を選択すると, 関数が呼ばれている場所やそこでかかっている時間などの情報が下のペインに表示されます。
下のペインの関数名をダブルクリックすると, 関数が呼ばれている場所まで移動できます。

_ 注意点

xdebug は便利なツールですが, 解析処理による負荷がかなりかかっています。
xdebug を有効にしたまま多数のリクエストを受けると一気に負荷が急上昇して, 最悪システムダウンする可能性もあります。*3
本番サービスを開始する際には, 必ず xdebug が無効になっていることを確認 して下さい。

 


pecl でインストールしたほうが pecl コマンドで管理できるようになりますのでこちらの方がオススメです


xdebug-2.0.0RC3 から xdebug.profiler_output_name の仕様が変わっています。デフォルトでは cachegrind.out.%p がプロファイル名として使用されます。


xdebug を有効にしたままユーザにメルマガを送ってしまって, その後悲惨な目に合いました... (^^;


 
添付ファイル: filewincachegrind2.jpg 734件 [詳細] filewincachegrind.jpg 1083件 [詳細]
 
Link: 負荷対策概論(1285d) FrontPage(1373d)
Last-modified: 2007-05-28 (月) 12:40:13 (1159d)