Thread profiler ツール

スレッドプロファイラーは、負荷の低いプロファイリングツールです。このツールは、本番環境で、アプリケーションのボトルネックを特定するために使えます。指定された期間、定期的(100ミリ秒単位)に各スレッドのスタックトレースをキャプチャします。指定された期間の終わりにスタックトレースを集約し、ツリーを構築します。ツリー内の呼び出し回数は、同じコンテキストで関数がスタックトレースに存在した回数に対応しています。

呼び出しツリーが実行全体をキャプチャすることはできませんが、アプリケーションの動作をよく表現するには、十分に大きいサンプルです。このサンプルはアプリのほとんどの時間を費している「ホット」な機能への洞察を提供します。

この機能の利用可否は、お使いのサブスクリプションレベルに依存します。

サポートしているエージェント

現在、この機能は以下のエージェントで利用可能です。

  • Java 用エージェントのバージョン 1.2.004.6 以降
  • .NET 用エージェントのバージョン 2.12.146.0 以降(詳しくは、.NET用エージェントの注意事項をご覧ください)
  • Python 用エージェントのバージョン 1.7.0 以降
  • Ruby 用エージェントのバージョン 3.5.5 以降(互換性のある Ruby 実装についての情報は、Ruby 用エージェントの注意事項をご覧ください。)

プロファイラの起動

スレッドプロファイラ機能はデフォルトで有効です。また、設定ファイルに以下のオプションを設定することで、オン、オフできます。

.NET エージェントでは、スレッドプロファイラーを無効にすることはできません。

有効にすると、New Relic の UI からスレッドプロファイラーを表示できるようになります。

  1. New Relicのメニューバーから、APM >(選択したアプリ)> Events > Thread profiler を選択する。
  2. プロファイラを実行するホストを選択する。
  3. プロファイリングセッションの継続時間を設定する。
  4. Start profiler [プロファイル開始]を押す。
thread-profiler-start_0.png
APM >(選択したアプリ)> Events > Thread profiler :このページから、スレッドプロファイラー期間の設定及び結果の表示が行えます。

「Start Profiler」ボタンを押すことで、次の収穫サイクル(1分ごと)の間にエージェントはスレッドプロファイラーを起動して、指定された期間のデータをキャプチャを開始します。

サンプルを取得した時点でスレッドが実行可能な状態にあるか否かに関係なく、スレッドのバックトレースは記録されます。よって、スリープ状態のスレッドや IO 上でブロックされているスレッドも呼び出しツリーに表示されることがあります。

プロファイルの表示

プロファイラの実行が終了した後、エージェントはプロファイルデータを報告します。呼び出しツリーは自動的に Thread profiler ページに表示されます。呼び出しツリー内の割合は、プロファイリングセッション中に現れた各呼び出しのパスにおけるスレッドのバックトレースのサンプルの割合を表します。

thread-profile-view_0.png
APM >(選択したアプリ)> Events > Thread profiler >(選択したプロファイル):これはスレッドプロファイルからの呼び出ツリーの例です。

ページではツリーの結果を色分けして表示します。

  • 赤:パーセンテージが30%以上
  • 黄色:パーセンテージが10%以上
  • 黒:パーセンテージが10%未満
行いたいこと 実施すること
スレッドプロファイル情報の表示方法を変更したい Tree settings[ツリーの設定]で利用可能なオプションから項目を選択して、Refres tree(ツリーの更新)を押す。
表示している情報の量を変更したい 呼び出しツリー上の Expand(展開)または Collapse[折りたたむ]オプションを選択するか、名前をまたは呼び出しツリー内の任意の行の矢印を選択する。
呼び出しツリーにおける任意の行のサマリー情報を表示したい ライン上にマウスを置く。
他のメンバーにスレッドプロファイル結果をメールしたい Share this profile [このプロファイルをシェアする]を押す。
別のセッションを起動したい。また、別のスレッドプロファイルを表示したい。 Back to all profiles[すべてのプロファイルに戻る]を選択する。

.NET用エージェントの注意事項

.NET用エージェントのおいてスレッドプロファイリングを使用する際にいくつか考慮する事があります。

.NETエージェント スレッドプロファイラの注意事項
マネージスレッドのみ .NET用エージェントの場合、スレッドプロファイラは、マネージスレッド上のスタックトレースだけをキャプチャします。アンマネージスレッドではスタックトレースをキャプチャしないということです。アンマネージ関数の呼び出しがマネージスレッドで発生した場合、スレッドプロファイラが Native:Function Call を呼び出しツリーに表示します。
行番号はない .NET のスレッドプロファイルは呼び出しツリーに行番号を含めません。ツリーの設定にあるShow line numbers [行番号を表示]チェックボックスは効きません。
64ビットのv4.0 .NET CLRにおけるバグ

64ビットバージョン4.0 .NET共通言語ランタイム(CLR)には、マネージスタックトレースを取得するためのエージェントのインタフェースにバグがあります。このバグが発生した場合、New Relic APM は空のスレッドプロファイルを表示します。このバグは32ビットアプリケーションでは発生しません。

このバグは .NET 4.5 の CLR のリリースで修正されています。あなたの64ビットアプリケーションが修正済みのバージョンかどうかは、C:\ Windows\Microsoft.NET\Framework64\v4.0.30319 ディレクトリにある mscorlib.dll のフルバージョンを見てください。4.0.30319.17379 以降のバージョンで修正されています。

Ruby用エージェントの注意事項

スレッドプロファイラが、アプリケーションからスレッドのバックトレースをキャプチャできるかどうかは、使用しているRuby によって決まります。このためThread#backtrace メソッドがある)MRI 1.9.2以降 が必要となります。

現在、Ruby 用エージェントは、Resque のバックグラウンドジョブではスレッドプロファイルをサポートしていません。Resque に対して開始されたスレッドプロファイリングセッションは、ジョブプロセスではなく、親プロセスからのトレースのみをキャプチャします。

JRuby のサポートは現時点では実験的なものです。JRuby の下で収集されたバックトレースの信頼性と精度は、JRuby の Thread#backtrace 実装に依存します。

関連情報

関連情報は次のとおりです。