スレッドプロファイラーは、負荷の低いプロファイリングツールです。このツールは、本番環境で、アプリケーションのボトルネックを特定するために使えます。指定された期間、定期的(100ミリ秒単位)に各スレッドのスタックトレースをキャプチャします。指定された期間の終わりにスタックトレースを集約し、ツリーを構築します。ツリー内の呼び出し回数は、同じコンテキストで関数がスタックトレースに存在した回数に対応しています。
呼び出しツリーが実行全体をキャプチャすることはできませんが、アプリケーションの動作をよく表現するには、十分に大きいサンプルです。このサンプルはアプリのほとんどの時間を費している「ホット」な機能への洞察を提供します。
目次
サポートしているエージェント
現在、この機能は以下のエージェントで利用可能です。
- Java 用エージェントのバージョン 1.2.004.6 以降
- .NET 用エージェントのバージョン 2.12.146.0 以降(詳しくは、.NET用エージェントの注意事項をご覧ください)
- Python 用エージェントのバージョン 1.7.0 以降
- Ruby 用エージェントのバージョン 3.5.5 以降(互換性のある Ruby 実装についての情報は、Ruby 用エージェントの注意事項をご覧ください。)
プロファイラの起動
スレッドプロファイラ機能はデフォルトで有効です。また、設定ファイルに以下のオプションを設定することで、オン、オフできます。
- Java:
thread_profiler.enabled
- Python:
thread_profiler.enabled
- Ruby:
thread_profiler.enabled
.NET エージェントでは、スレッドプロファイラーを無効にすることはできません。
有効にすると、New Relic の UI からスレッドプロファイラーを表示できるようになります。
- New Relicのメニューバーから、APM >(選択したアプリ)> Events > Thread profiler を選択する。
- プロファイラを実行するホストを選択する。
- プロファイリングセッションの継続時間を設定する。
- Start profiler [プロファイル開始]を押す。

「Start Profiler」ボタンを押すことで、次の収穫サイクル(1分ごと)の間にエージェントはスレッドプロファイラーを起動して、指定された期間のデータをキャプチャを開始します。
プロファイルの表示
プロファイラの実行が終了した後、エージェントはプロファイルデータを報告します。呼び出しツリーは自動的に 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 ディレクトリにある |
Ruby用エージェントの注意事項
スレッドプロファイラが、アプリケーションからスレッドのバックトレースをキャプチャできるかどうかは、使用しているRuby によって決まります。このため(Thread#backtrace
メソッドがある)MRI 1.9.2以降 が必要となります。
現在、Ruby 用エージェントは、Resque のバックグラウンドジョブではスレッドプロファイルをサポートしていません。Resque に対して開始されたスレッドプロファイリングセッションは、ジョブプロセスではなく、親プロセスからのトレースのみをキャプチャします。
JRuby のサポートは現時点では実験的なものです。JRuby の下で収集されたバックトレースの信頼性と精度は、JRuby の Thread#backtrace
実装に依存します。
関連情報
関連情報は次のとおりです。
- Java 用エージェントの設定 [英語]とNew Relic の Java 用エージェントとセキュリティ [英語] (Java用エージェントのスレッドプロファイラのオプションとセキュリティの検討事項について)
- Python 用エージェントの設定 [英語]とPython 用エージェントのステータス [英語] (Python 用エージェントのスレッドプロファイルに関連するサーバー側の設定オプションと制限事項について)
- X-Ray セッションの Thread Profile ツール (特に X-Ray セッションのスレッドプロファイラの手続きについて)