スレッドプロファイラは、アプリケーションのボトルネックを特定するために実運用環境で使用できる、影響の少ないプロファイリングツールです。スレッドプロファイラは、各スレッドのスタックトレースを定期的(100ms)にキャプチャし、指定された期間で動作します。指定された期間が終了すると、スタックトレースが集約され、ツリーが構築されます。ツリー内のコールカウントは、同じコンテキストでスタックトレース内にその関数が存在した回数に対応します。
コールツリーは実行全体を捉えることはできませんが、十分に大きなサンプルはアプリケーションの動作をよく表しています。これにより、ほとんどの時間が費やされているアプリの"ホット" の機能についての洞察が得られます。この範囲では、0.05%未満しかサンプリングされていないエントリは省略されます。
対応エージェント
この機能は、特定のエージェントやバージョンでのみ利用可能です。
Javaです。Agentバージョン1.2.004.6以上
.NETに対応しています。
- フレームワーク。Agentバージョン2.12.146.0以上
- .NET Core 2.0を使用しています。Agentバージョン8.3.360.0以降(Windowsのみ)
- Linux: .NET Core 3.0以上、エージェントバージョン8.23以上
Pythonです。Agentバージョン1.7.0以上
Rubyを使用しています。Agentバージョン3.5.5以上
プロファイラーの起動
スレッドプロファイラ機能は、デフォルトで有効になっています。また、エージェントの設定ファイルでオン/オフを切り替えることができる場合もあります。
Javaです。 thread_profiler.enabled
NET: .NET アプリでスレッド プロファイラーを無効にします
cannot
。
パイソン: thread_profiler.enabled
ルビー: thread_profiler.enabled
この機能を有効にすると、ユーザーインターフェースからスレッドプロファイラを表示することができます。
one.newrelic.com > All capabilities > APM & services > (select an app) > Events > Thread profiler
に移動します。
プロファイラーを実行するホストを選択します。
プロファイリングセッションの継続時間を設定します。
Start profiler
を選択します。
これにより、エージェントは次のハーベストサイクル(1分ごと)にスレッドプロファイラを起動し、指定された期間のデータを取得するようになります。サンプル取得時に実行可能な状態であるかどうかに関わらず、スレッドのバックトレースを記録します。スリープしているスレッドやIOでブロックされているスレッドがコールツリーに表示されることがあります。
one.newrelic.com > All capabilities > APM & services > (select an app) > Events > Thread profiler: このページを使用して、スレッド プロファイラーの期間の設定を定義し、結果を表示します。
プロフィールデータを見る
プロファイラーの実行が終了すると、エージェントはプロファイル データを報告します。 コールツリーはThread profilerページに自動的に表示されます。 呼び出しツリーのパーセンテージは、プロファイリング セッション中に各呼び出しパスが出現したスレッド バックトレース サンプルのパーセンテージを表します。 データ収集は、PROFILE COLLECTED 時刻に開始されました。
このページでは、ツリーの結果を色分けしています。
- 赤。30%以上の割合
- 黄色。割合が10%を超えるもの
- ブラック割合が10%未満
If you want to... | Do this... |
---|
スレッドのプロフィール情報の表示方法の変更 | Tree settingsで利用可能なオプションを選択し、 Refresh treeを選択します。 |
情報表示量の変更 | 呼び出しツリーの上にあるExpandまたはCollapseオプションを選択するか、呼び出しツリー内の任意の行にある名前または矢印を選択します。 |
コールツリー内の任意の行のサマリー情報を表示する | ラインにマウスオーバーします。 |
スレッドプロファイルの結果を他の人にメールで送信 | Share this profileを選択します。 |
別のセッションを開始したり、別のスレッドプロファイルを表示する | Back to all profilesを選択します。 |
エージェントの考慮事項
どのエージェントを使用するかによって、スレッドプロファイリング機能には追加の考慮事項があります。
Java エージェントでスレッド プロファイリングを使用する場合は、次の点に注意してください。
Java agent | Thread profiler notes |
---|
ツリー設定にはOtherカテゴリのみが表示されます | すべてのスレッドはOtherカテゴリに分類されます。 Web RequestおよびBackgroundカテゴリはサポートされていません。 |
.NET Frameworkのエージェントでスレッドプロファイリングを使用する場合、以下の点に注意してください。
.NET agent | Thread profiler notes |
---|
サポート対象 Linux | .NET エージェント バージョン 8.23 以降を実行している場合、 Linuxのスレッド プロファイリングは .NET Core 3.0 以降のアプリケーションでサポートされます。 |
管理されたスレッドのみ | .NET エージェントの場合、スレッド プロファイラーはマネージド スレッドのスタック トレースのみをキャプチャします。アンマネージ スレッドのスタック トレースはキャプチャされません。マネージ スレッドでアンマネージ関数の呼び出しが発生した場合、スレッド プロファイラーは呼び出しツリーにNative:Function Call を表示します。 |
ラインナンバーなし | .NET スレッド プロファイルには、呼び出しツリーの行番号が含まれません。 ツリー設定のShow line numbersチェックボックスは効果がありません。 |
64bit v4.0 .NET CLRの不具合について | 64ビット版の4.0 .NET共通言語ランタイム(CLR)には、エージェントが管理されたスタックトレースを取得する機能を妨害するバグがあります。アプリケーションにこのバグがある場合、APMは空のスレッドプロファイルを表示します。このバグは、32ビットアプリケーションには影響しません。 このバグは、.NET 4.5 の CLR リリースで修正されています。 64 ビット アプリケーションに修正バージョンがあるかどうかを確認するには、 C:\Windows\Microsoft.NET\Framework64\v4.0.30319ディレクトリにあるmscorlib.dll の完全バージョンを確認します。 修正はバージョン 4.0.30319.17379 以降で適用されます。 |
Other カテゴリのみ | すべてのスレッドはOtherカテゴリに分類されます。 Web RequestおよびBackgroundカテゴリはサポートされていません。 |
Pythonエージェントでスレッドプロファイリングを使用する場合、以下の点に注意してください。
Python agent | Thread profiler notes |
---|
コルーティンベースのシステム | gunicorn の gevent や eventlet モードのようなコルーチンベースのシステムを使用している場合、詳細をキャプチャするには限界があります。新しいスレッドを作成する場合、Pythonエージェントはスレッドプロファイラのバックグラウンドスレッドではなく、実際にグリーンレットを作成します。そのため、スレッドプロファイラは、スレッドプロファイラページ上のWebリクエストとバックグラウンドトランザクションをキャプチャしません。 |
グリーンレット | グリーンレットは,他のグリーンレットがブロックしたときなど,明示的に制御を放棄したときにのみ実行できます。例えば、スレッドサンプラが実行された場合、他のグリーンレットがブロックされた時点でのみスタックをサンプリングします。他のグリーンレットが任意のコードを実行しているときにはサンプリングしません。グリーンレットがブロックされたり、他のグリーンレットに譲ったりしていなければ、グリーンレット内の実行を完全に見逃すことができます。 |
Pythonコードの時間 | リクエストをブロックしていない純粋なPythonコードに費やされた時間はピックアップされず、情報は記録されず、報告もされません。これは、コルーチンが使用されている場合、結果が誤解を招くためです。 |
Rubyエージェントでスレッドプロファイリングを使用する場合、以下の点に注意してください。
Ruby agent | Thread profiler notes |
---|
バックトレース | スレッド プロファイラーは、Ruby アプリケーション内からスレッド バックトレースをキャプチャする機能に依存します。 このため、 CRuby 1.9.2 or higher ( Thread#backtrace メソッド用) が必要になります。 |
Resque | Rubyエージェントは現在、Resqueのバックグラウンド・ジョブでのスレッド・プロファイルをサポートしていません。Resqueに対して開始されたスレッド・プロファイリング・セッションは、ジョブ・プロセスではなく、親プロセスからのトレースのみをキャプチャします。 |
JRuby | JRuby のサポートは、現時点では実験的なものと見なされています。JRuby のThread#backtrace 実装には、JRuby で収集されるバックトレースの精度と信頼性に影響を与える既知の問題があります。 |