スレッドプロファイラは、アプリケーションのボトルネックを特定するために実運用環境で使用できる、影響の少ないプロファイリングツールです。スレッドプロファイラは、各スレッドのスタックトレースを定期的(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アプリでスレッドプロファイラーを無効にすることはできません。
- パイソン:
thread_profiler.enabled
- ルビー:
thread_profiler.enabled
この機能を有効にすると、ユーザーインターフェースからスレッドプロファイラを表示することができます。
- one.newrelic.com > All capabilities > APM & services > (アプリを選択) > Events > Thread profilerに移動します。
- プロファイラーを実行するホストを選択します。
- プロファイリングセッションの継続時間を設定します。
- Select Start profiler.
これにより、エージェントは次のハーベストサイクル(1分ごと)にスレッドプロファイラを起動し、指定された期間のデータを取得するようになります。サンプル取得時に実行可能な状態であるかどうかに関わらず、スレッドのバックトレースを記録します。スリープしているスレッドやIOでブロックされているスレッドがコールツリーに表示されることがあります。
one.newrelic.com >All capabilities > APM & services > (アプリを選択) > Events > Thread profiler: このページを使用して、スレッド プロファイラー期間の設定を定義し、結果を表示します。
プロフィールデータを見る
プロファイラの実行が終了すると、エージェントがプロファイルデータを報告します。コールツリーは、 Thread profiler ページに自動的に表示されます。コールツリーのパーセンテージは、プロファイリングセッション中に各コールパスが出現したスレッドバックトレースサンプルのパーセンテージを表しています。データ収集はPROFILE COLLECTEDの時間に開始されました。
このページでは、ツリーの結果を色分けしています。
- 赤。30%以上の割合
- 黄色。割合が10%を超えるもの
- ブラック割合が10%未満
あなたがしたい場合は... | これを行う... |
---|
スレッドのプロフィール情報の表示方法の変更 | Tree settings で利用可能なオプションを選択し、 Refresh tree を選択します。 |
情報表示量の変更 | コールツリーの上にある「 Expand 」または「 Collapse 」オプションを選択するか、コールツリーの任意の行で名前または矢印を選択します。 |
コールツリー内の任意の行のサマリー情報を表示する | ラインにマウスオーバーします。 |
スレッドプロファイルの結果を他の人にメールで送信 | Select Share this profile. |
別のセッションを開始したり、別のスレッドプロファイルを表示する | 選択 すべてのプロファイルに戻る. |
エージェントの考慮事項
どのエージェントを使用するかによって、スレッドプロファイリング機能には追加の考慮事項があります。
Java エージェントでスレッド プロファイリングを使用する場合は、次の点に注意してください。
Javaエージェント | スレッドプロファイラーの注意点 |
---|
ツリー設定は Other [他の] カテゴリのみを表示します | すべてのスレッドは、 Other カテゴリに入れられます。 Web Request と Background のカテゴリはサポートされていません。 |
.NET Frameworkのエージェントでスレッドプロファイリングを使用する場合、以下の点に注意してください。
.NETエージェント | スレッドプロファイラーの注意点 |
---|
Linuxでサポートされています。 | Linux 上のスレッドプロファイリングは、.NETエージェントバージョン8.23以降を実行する場合、.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 カテゴリに入れられます。 Web Request と Background のカテゴリはサポートされていません。 |
Pythonエージェントでスレッドプロファイリングを使用する場合、以下の点に注意してください。
Pythonエージェント | スレッドプロファイラーの注意点 |
---|
コルーティンベースのシステム | gunicorn の gevent や eventlet モードのようなコルーチンベースのシステムを使用している場合、詳細をキャプチャするには限界があります。新しいスレッドを作成する場合、Pythonエージェントはスレッドプロファイラのバックグラウンドスレッドではなく、実際にグリーンレットを作成します。そのため、スレッドプロファイラは、スレッドプロファイラページ上のWebリクエストとバックグラウンドトランザクションをキャプチャしません。 |
グリーンレット | グリーンレットは,他のグリーンレットがブロックしたときなど,明示的に制御を放棄したときにのみ実行できます。例えば、スレッドサンプラが実行された場合、他のグリーンレットがブロックされた時点でのみスタックをサンプリングします。他のグリーンレットが任意のコードを実行しているときにはサンプリングしません。グリーンレットがブロックされたり、他のグリーンレットに譲ったりしていなければ、グリーンレット内の実行を完全に見逃すことができます。 |
Pythonコードの時間 | リクエストをブロックしていない純粋なPythonコードに費やされた時間はピックアップされず、情報は記録されず、報告もされません。これは、コルーチンが使用されている場合、結果が誤解を招くためです。 |
Rubyエージェントでスレッドプロファイリングを使用する場合、以下の点に注意してください。
Rubyエージェント | スレッドプロファイラーの注意点 |
---|
バックトレース | スレッド プロファイラーは、Ruby アプリケーション内からスレッド バックトレースをキャプチャする機能に依存します。このため、 CRuby 1.9.2 以降( Thread#backtrace メソッド用) が必要です。 |
Resque | Rubyエージェントは現在、Resqueのバックグラウンド・ジョブでのスレッド・プロファイルをサポートしていません。Resqueに対して開始されたスレッド・プロファイリング・セッションは、ジョブ・プロセスではなく、親プロセスからのトレースのみをキャプチャします。 |
JRuby | JRuby のサポートは、現時点では実験的なものと見なされています。JRuby のThread#backtrace 実装には、JRuby で収集されるバックトレースの精度と信頼性に影響を与える既知の問題があります。 |