xhprofを利用する

アプリケーションのパフォーマンスを向上させるためにはプロファイラと呼ばれるツールを利用するのが早いです。
phpではxhprofというプロファイラがメジャーであり今回はその導入手順や使用感について紹介します。

インストール

PECLから入れます。そんなに難しくありません。

  • ソースをダウンロード
wget http://pecl.php.net/get/xhprof-0.9.2.tgz
  • make
tar zxvf xhprof-0.9.2.tar
cd xhprof-0.9.2/extension/
phpize
make
make install
  • php.iniを編集
[xhprof]
extension=xhprof.so
xhprof.output_dir=/var/log/xhprof
  • ログディレクトリを作成
mkdir /var/log/xhprof
chmod -R 777 /var/log/xhprof
  • apache再起動
service httpd restart
  • xhprofのテンプレディレクトリをドキュメントルート配下に移動
cp -r /tmp/xhprof-0.9.2/xhprof_html {document_root}/xhprof_html
cp -r /tmp/xhprof-0.9.2/xhprof_lib {document_root}/xhprof_lib
  • プロファイリングしたい箇所にコードを埋め込みます

{document_root}は適宜自分の環境に置き換えてください。

xhprof_enable(); // プロファイリング開始

//
// ** プロファイリングしたい処理をここに記述 **
//

$xhprof_data = xhprof_disable();    //stop profiler
 
//  プロファイリングページへのリンクを追加
include_once "{document_root}/xhprof_lib.php";
include_once "{document_root}/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, $XHPROF_SOURCE_NAME);
echo "<a href=\"http://{document_root}/xhprof_html/index.php?run=$run_id&source=$XHPROF_SOURCE_NAME\">xhprof Result</a>\n";

結果

実行すると結果ページヘのリンクが表示されます。クリックすることで結果の詳細を確認することができます。

おぉー参照できましたね。なかなかにいいかんじです。

  • 各項目
項目 意味
Function Name 関数名
Calls プロファイリングした期間でコールされた回数
Calls% コール回数のパーセント表示
Incl. Wall Time 処理にかかった時間のうち、その関数が消費した時間。なお処理をネストした場合全経過時間を含むことになるので、あまり参考することはないと思われる
IWall% Incl. Wall Timeのパーセント表示
Excl. Wall Time 実際にその関数のみが消費した時間。多くの場合はこの項目なんかを参照しながらプロファイリングすることになると思われる
IWall% Execl. Wall Timeのパーセント表示

なるほどかなり正確な情報が把握できて、最終的にボトルネックになっている箇所が確認できます。
実際に動かしてみると、当然ですが大きく時間を消費していたのがネットワーク処理、ついでファイル処理などかなり実用的なレベルで参考することができそうです。

余談

ちなみに結構長い間フリーランスしてる同僚と、プロファイリングからの性能検証について雑談してて。
現実的な現場感としては、こういったプロファイリングを常に実行してボトルネックをチェックすることが多いのかな。ということについて話してると、現実的には実際に何か問題が発覚してから調査する。ってのが多いようです。

あとは細かな性能検証も大事なんですが、昔と比べてマシンのスペックが格段に向上しているのでアプリのチューニングを突き詰めていくよりかは、マシンを追加してインフラ面からパワーを上げて対応する事が多いです。
(もちろん普通にボトルネックになっているような場合は除く。アプリのチューニングが不要と言っているわけではないです。)

実際その通りで、僕もどちらかと言うと小難しいコンパクトなコードを書くよりかは、コストが多少高くつくとしても可読性の高いコードを書くように心がけています。
(よくある普通のレベルの企業では)あまり出番の多いわけではさそうですが、覚えておくと絶対役に立ちますね。
個人的には常にこのへんの意識は頭のなかにあるエンジニアでいたいです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください