スレッドプロファイラは、アプリケーションのボトルネックを特定するために実運用環境で使用できる、影響の少ないプロファイリングツールです。スレッドプロファイラは、各スレッドのスタックトレースを定期的(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 エージェントでスレッド プロファイリングを使用する場合は、次の点に注意してください。
Javaエージェント
スレッドプロファイラーの注意点
ツリー設定は Other [他の] カテゴリのみを表示します
すべてのスレッドは、 Other カテゴリに入れられます。 Web Request と Background のカテゴリはサポートされていません。
.NET特有の注意点 .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エージェントでスレッドプロファイリングを使用する場合、以下の点に注意してください。
Pythonエージェント
スレッドプロファイラーの注意点
コルーティンベースのシステム
gunicorn の gevent や eventlet モードのようなコルーチンベースのシステムを使用している場合、詳細をキャプチャするには限界があります。新しいスレッドを作成する場合、Pythonエージェントはスレッドプロファイラのバックグラウンドスレッドではなく、実際にグリーンレットを作成します。そのため、スレッドプロファイラは、スレッドプロファイラページ上のWebリクエストとバックグラウンドトランザクションをキャプチャしません。
グリーンレット
グリーンレットは,他のグリーンレットがブロックしたときなど,明示的に制御を放棄したときにのみ実行できます。例えば、スレッドサンプラが実行された場合、他のグリーンレットがブロックされた時点でのみスタックをサンプリングします。他のグリーンレットが任意のコードを実行しているときにはサンプリングしません。グリーンレットがブロックされたり、他のグリーンレットに譲ったりしていなければ、グリーンレット内の実行を完全に見逃すことができます。
Pythonコードの時間
リクエストをブロックしていない純粋なPythonコードに費やされた時間はピックアップされず、情報は記録されず、報告もされません。これは、コルーチンが使用されている場合、結果が誤解を招くためです。
Ruby特有の注意点 Rubyエージェントでスレッドプロファイリングを使用する場合、以下の点に注意してください。
Rubyエージェント
スレッドプロファイラーの注意点
バックトレース
スレッド プロファイラーは、Ruby アプリケーション内からスレッド バックトレースをキャプチャする機能に依存します。このため、 CRuby 1.9.2 以降 ( Thread#backtrace
メソッド用) が必要です。
Resque
Rubyエージェントは現在、Resqueのバックグラウンド・ジョブでのスレッド・プロファイルをサポートしていません。Resqueに対して開始されたスレッド・プロファイリング・セッションは、ジョブ・プロセスではなく、親プロセスからのトレースのみをキャプチャします。
JRuby
JRuby のサポートは、現時点では実験的なものと見なされています。JRuby のThread#backtrace
実装には、JRuby で収集されるバックトレースの精度と信頼性に影響を与える既知の問題があります。