プロファイルの検索
各行は、短時間のプロセスのプロファイルです。デフォルトでは、プロファイルは 1 分に 1 回アップロードされます。言語に応じて、これらのプロセスは 15 秒から 60 秒の間でプロファイルされます。
環境トレース構成から設定されたインフラストラクチャータグまたはアプリケーションタグに従ってフィルタリングできます。デフォルトでは、次のファセットを使用できます。
ファセット | 定義 |
---|
Env | アプリケーションが実行されている環境(production 、staging )。 |
サービス | コードが実行しているサービスの名前。 |
バージョン | コードのバージョン。 |
ホスト | プロファイルされたプロセスが実行しているホスト名。 |
ランタイム | プロファイルされたプロセスが実行しているランタイムのタイプ(JVM 、CPython )。 |
次のメジャーを使用できます。
メジャー | 定義 |
---|
CPU | CPU 使用量 (コア単位) |
メモリ割り当て | プロファイル全体でのメモリ割り当て率。割り当てられたメモリはプロファイル中にガベージコレクションされる可能性があるため、この値はシステムのメモリ量を超える可能性があります。 |
プロファイル
行をクリックして、特定のプロファイルを表示します。
ヘッダーには、プロファイルを生成したサービスや、それに関連付けられた環境とコードバージョンなど、プロファイルに関連付けられた情報が含まれています。
4 つのタブがプロファイルヘッダーの下にあります。
タブ | 定義 |
---|
プロファイル | 現在見ているプロファイルのフレームグラフとサマリーテーブル。プロファイルタイプ(例えば、CPU 、Memory allocation )を切り替えることができます |
Analysis | コードの潜在的な問題または改善の領域を示唆する一連のヒューリスティック。Java でのみ利用できます。 |
メトリクス | 同じサービスのすべてのプロファイルからのプロファイラーメトリクス |
ランタイム情報 | サポートされている言語のランタイムプロパティとプロファイルタグ。 |
注: 各プロファイルの右上隅には、次のオプションがあります。
- プロフィールをダウンロードする
- プロファイルをフルスクリーンに切り替える
プロファイルタイプ
Profiles タブでは、特定の言語で使用できるすべてのプロファイルタイプを確認できます。言語によって、プロファイルについて収集される情報は異なります。
有効にすると、次のプロファイルタイプが収集されます。
- CPU
- 各メソッドが CPU での実行に費やした時間。これには JVM(Java、Kotlin など)で実行されるコードが含まれますが、JVM オペレーションや JVM 内から呼び出されるネイティブコードは含まれません。
- Allocations
- 各メソッドによって割り当てられたヒープメモリの量。これには、後で解放された割り当ても含まれます。
- Wall Time in Native Code
- ネイティブコードで費やされた経過時間。経過時間には、コードが CPU で実行されている時間、I/O を待機している時間、およびメソッドの実行中に発生するその他の時間が含まれます。このプロファイルには、通常ほとんどのアプリケーションコードである JVM バイトコードの実行に費やされた時間は含まれていません。
- Class Load
- 各メソッドによってロードされたクラスの数。
- Thrown Exceptions
- 各メソッドによってスローされたエラーと例外の数、およびその種類。
- File I/O
- 各メソッドがファイルの読み取りと書き込みに費やした時間。
- Lock
- 各メソッドがロックの待機に費やした時間。
- Socket I/O
- 各メソッドがソケット I/O の読み取りと書き込みに費やした時間。
有効にすると、次のプロファイルタイプが収集されます。
- CPU
- Python やネイティブコードを含む、各関数が CPU での実行に費やした時間。
- Wall Time
- 各関数が使用した経過時間。経過時間には、コードが CPU で実行されている時間、I/O を待機している時間、および関数の実行中に発生するその他の時間が含まれます。
- Heap Live Size
- 各関数によって割り当てられたヒープメモリのうち、まだガベージコレクションとして処理されていないメモリの量。これは、サービスの全体的なメモリ使用量を調査し、潜在的なメモリリークを特定する際に役立ちます。
- Allocated Memory
- 各関数によって割り当てられたヒープメモリの量。これには、後で解放された割り当ても含まれます。Python 3 でのみサポートされます。
- Allocations
- 各関数によるヒープ割り当ての数。これには、後で解放された割り当ても含まれます。
- Thrown Exceptions
- 各関数によって発生したキャッチまたはキャッチされない例外の数、およびその種類。
- Lock Wait Time
- 各関数がロックの待機に費やした時間。
- Locked Time
- 各関数がロックの保持に費やした時間。
- Lock Acquires
- 各関数がロックを取得した回数。
- Lock Releases
- 各関数がロックを解除した回数。
有効にすると、次のプロファイルタイプが収集されます。
- CPU Time
- 各関数が CPU での実行に費やした時間。ネットワーキング、チャンネル、ミューテックス、スリープの待機のような Off-CPU の時間は、このプロファイルでキャプチャされません。ミューテックスおよびブロックのプロファイルをご確認ください。
- Allocations
- プロファイリング期間中 (デフォルト: 60 秒) に各関数がヒープメモリで割り当てたオブジェクトの数 (その後に解放された割り当ても含む)。Go ではこれを
alloc_objects
と呼びます。スタックの割り当ては追跡されません。これは、ガベージコレクションの負荷を調査する場合に便利です。バージョン 1.33.0
でのこの指標の変更点については、差分プロファイルをご覧ください。 - Allocated Memory
- プロファイリング期間中 (デフォルト: 60 秒) に各関数が割り当てたヒープメモリの数 (その後に解放された割り当ても含む)。Go ではこれを
alloc_space
と呼びます。スタックの割り当ては追跡されません。これは、ガベージコレクションの負荷を調査する場合に便利です。バージョン 1.33.0
でのこの指標の変更点については、差分プロファイルをご覧ください。 - Heap Live Objects
- 各関数がヒープメモリに割り当てたオブジェクトのうち、まだガベージコレクションとして処理されていないオブジェクトの数。Go ではこれを
inuse_objects
と呼びます。これは、サービスの全体的なメモリ使用量を調査し、潜在的なメモリリークを特定する際に役立ちます。 - Heap Live Size
- 各関数によって割り当てられたヒープメモリのうち、まだガベージコレクションとして処理されていないメモリの量。Go ではこれを
inuse_space
と呼びます。これは、サービスの全体的なメモリ使用量を調査し、潜在的なメモリリークを特定する際に役立ちます。 - Mutex
- プロファイリング期間中 (デフォルト: 60 秒) に関数がミューテックスを待機している時間。このプロファイルのスタックトレースは、ミューテックスで続行をブロックされた別の goroutine を許可した
Unlock()
演算子をポイントします。スピンロックを使用したショートミューテックスの競合はこのプロファイルでキャプチャされませんが、CPU プロファイルで確認できます。バージョン 1.33.0
でのこの指標の変更点については、差分プロファイルをご覧ください。 - Block
- プロファイリング期間中 (デフォルト: 60 秒) に関数がミューテックスおよびチャンネルオペレーションを待機している時間。スリープ、GC、ネットワーク、Syscall オペレーションは、このプロファイルでキャプチャされません。ブロッキングオペレーションは、ブロックが解除されてからのみキャプチャされるため、スタックしていると思われるアプリケーションのデバッグにこのプロファイルを使用することはできません。ミューテックスの競合の場合、このプロファイルのスタックトレースはブロックされた
Lock()
演算子をポイントします。これにより、ブロックされているプログラムがわかり、ミューテックスプロファイルにより、競合の原因となっているプログラムの部分がわかります。この点に関する詳しい情報は、Go におけるプロファイリングのブロックリサーチをご覧ください。バージョン 1.33.0
でのこの指標の変更点については、差分プロファイルをご覧ください。注: ブロックプロファイラーを使用すると、本番環境において顕著なオーバーヘッドが発生する可能性があります。本番環境で有効にする場合は、高いレート (100000000
、つまり 100 ミリ秒など) を選択し、レイテンシーや CPU 使用率の増加の兆候を確認します。 - Goroutines
- 同じ関数(オン CPU とオフ CPU の待機の両方)で現在実行中の goroutines の数のスナップショット。スナップショット間での goroutines の増加は、プログラムで goroutines がリークしていることを示しています。最も健康なアプリケーションでは、このプロファイルはワーカープールとその goroutines 使用数によって支配されます。遅延の影響を非常に受けやすく、大量の goroutines(10.000 以上)を使用するアプリケーションの場合、このプロファイルを有効にすると stop-the-world 型の一時停止が必要になることにご留意ください。一時停止はプロファイリング期間(デフォルトは 60 秒)ごとに発生し、通常 goroutine あたり
1μsec
ほど継続します。100ms
ほどの p99 レイテンシー SLO の典型的なアプリケーションでは、この警告を無視することが可能です。より詳しい情報については、Go における Goroutine プロファイリングリサーチをご覧ください。
差分プロファイル
注:
1.33.0
より前のバージョンの Go プロファイラーでは、Allocations、Allocated Memory、Mutex、および Block のメトリクスは、
プロファイリング期間中ではなく、
プロセスが開始されてから累積した測定値として表示されます。バージョン
1.33.0
のデルタプロファイルへの変更により、これらの測定値が蓄積されるのではなく、どのように変化しているかを確認することができます。デルタプロファイリングはデフォルトでオンになっています。プロファイラーのバージョン
1.35.0
では、
WithDeltaProfiles
オプションを使用してデルタプロファイルを無効にすることができます。
プロファイラーバージョン
1.37.0
では、アップロード帯域幅の使用量を減らすため、デルタプロファイリングが有効な場合は累積プロファイルがアップロードされなくなりました。完全な累積プロファイルに依存している場合は、
サポートに連絡して使用例について相談してください。
有効にすると、次のプロファイルタイプが収集されます。
- CPU
- Ruby やネイティブコードを含む、各関数が CPU での実行に費やした時間。
- Wall Time
- 各関数が使用した経過時間。経過時間には、コードが CPU で実行されている時間、I/O を待機している時間、および関数の実行中に発生するその他の時間が含まれます。
有効にすると、次のプロファイルタイプが収集されます。
- Wall Time
- 各関数が使用した経過時間。経過時間には、コードが CPU で実行されている時間、I/O を待機している時間、および関数の実行中に発生するその他の時間が含まれます。
- Heap Live Size
- 各関数によって割り当てられたヒープメモリのうち、まだガベージコレクションとして処理されていないメモリの量。これは、サービスの全体的なメモリ使用量を調査し、潜在的なメモリリークを特定する際に役立ちます。
有効にすると、次のプロファイルタイプが収集されます。
- Wall Time
- マネージドメソッドに費やされた経過時間。経過時間には、コードが CPU で実行されている時間、I/O を待機している時間、およびメソッドの実行中に発生するその他の時間が含まれます。
- CPU
- 各メソッドが CPU での実行に費やした時間。
- Thrown Exceptions
- 各メソッドによって発生したキャッチまたはキャッチされない例外の数、およびその種類とメッセージ。
有効にすると、次のプロファイルタイプが収集されます。
- Wall Time
- 各関数が使用した経過時間。経過時間には、コードが CPU で実行されている時間、I/O を待機している時間、および関数の実行中に発生するその他の時間が含まれます。
- CPU
- 各関数が CPU での実行に費やした時間を示します。
有効にすると、次のプロファイルタイプが収集されます。
- CPU
- 各関数が CPU での実行に費やした時間。
- Allocations
- プロファイリング期間中 (デフォルト: 59 秒) に各関数が行った割り当て数 (その後に解放された割り当てを含む)。スタックの割り当ては追跡されません。
- Allocated memory
- プロファイリング期間中 (デフォルト: 59 秒) に各関数が割り当てたヒープメモリの量 (その後に解放された割り当て分も含む)。スタックの割り当ては追跡されません。
その他の参考資料