パフォーマンス

OpenTelemetry Java エージェントのパフォーマンスリファレンス

OpenTelemetry Java エージェントは、同じ Java 仮想マシン(JVM)内で動作することでアプリケーションを計装します。 他のソフトウェアエージェントと同様に、Java エージェントは CPU、メモリ、ネットワーク帯域幅などのシステムリソースを必要とします。 エージェントによるリソース使用量は、エージェントオーバーヘッドまたはパフォーマンスオーバーヘッドと呼ばれます。 OpenTelemetry Java エージェントは JVM アプリケーションを計装する際のシステムパフォーマンスへの影響は最小限ですが、最終的なエージェントオーバーヘッドは複数の要因に依存します。

エージェントオーバーヘッドを増加させる可能性のある要因には、物理マシンのアーキテクチャ、CPU 周波数、メモリの量と速度、システム温度、リソース競合といった環境的な要因があります。 その他の要因としては、仮想化とコンテナ化、オペレーティングシステムとそのライブラリ、JVM のバージョンとベンダー、JVM の設定、監視対象ソフトウェアのアルゴリズム設計、ソフトウェアの依存関係などが挙げられます。

現代のソフトウェアの複雑さとデプロイシナリオの多様性により、単一のエージェントオーバーヘッドの見積もりを算出することは不可能です。 特定のデプロイ環境における計装エージェントのオーバーヘッドを把握するには、実験を行い、直接測定値を収集する必要があります。 そのため、パフォーマンスに関するすべての記述は、特定のシステムにおける評価を前提とした一般的な情報およびガイドラインとして扱ってください。

以下のセクションでは、OpenTelemetry Java エージェントの最小要件、パフォーマンスに影響を与える可能性のある制約事項、およびエージェントのパフォーマンスを最適化・トラブルシューティングするためのガイドラインについて説明します。

エージェントオーバーヘッドを削減するためのガイドライン

以下のベストプラクティスとテクニックは、Java エージェントによるオーバーヘッドの削減に役立つ可能性があります。

トレースサンプリングの設定

計装によって処理されるスパンの量は、エージェントオーバーヘッドに影響を与える可能性があります。 トレースサンプリングを設定してスパンの量を調整し、リソース使用量を削減できます。 サンプリングを参照してください。

特定の計装の無効化

不要な計装や、スパンを過剰に生成している計装を無効にすることで、エージェントオーバーヘッドをさらに削減できます。 計装を無効にするには、-Dotel.instrumentation.<name>.enabled=false または環境変数 OTEL_INSTRUMENTATION_<NAME>_ENABLED を使用します。 ここで <name> は計装の名前です。

たとえば、以下のオプションは JDBC 計装を無効にします。 -Dotel.instrumentation.jdbc.enabled=false

アプリケーションへのメモリ割り当てを増やす

-Xmx<size> オプションを使用して JVM の最大ヒープサイズを増やすことで、エージェントオーバーヘッドの問題を軽減できる可能性があります。 計装はメモリ上に大量の短命オブジェクトを生成することがあるためです。

手動計装を必要なものに絞る

過度な手動計装は、エージェントオーバーヘッドを増加させる非効率性を招く可能性があります。 たとえば、すべてのメソッドに @WithSpan を使用すると、スパンの量が多くなり、データのノイズが増加し、より多くのシステムリソースを消費します。

十分なリソースのプロビジョニング

計装と Collector に十分なリソースをプロビジョニングしてください。 メモリやディスクなどの必要なリソース量は、アプリケーションのアーキテクチャとニーズに依存します。 たとえば、一般的な構成として、計装されたアプリケーションと OpenTelemetry Collector を同じホストで実行する場合があります。 その場合、Collector のリソースを適切にサイジングし、設定を最適化することを検討してください。 スケーリングを参照してください。

Java エージェントのパフォーマンスに影響する制約事項

一般的に、アプリケーションから収集するテレメトリーが多いほど、エージェントオーバーヘッドへの影響は大きくなります。 たとえば、アプリケーションに関連のないメソッドをトレースしても、そのようなメソッドのトレースはメソッド自体の実行よりも計算コストが高いため、かなりのエージェントオーバーヘッドが発生する可能性があります。 同様に、メトリクスにおける高カーディナリティのタグはメモリ使用量を増加させる可能性があります。 デバッグログが有効になっている場合、ディスクへの書き込み操作とメモリ使用量も増加します。

一部の計装(たとえば JDBC や Redis)は、スパンの量が多くなり、エージェントオーバーヘッドが増加します。 不要な計装を無効にする方法の詳細は、特定の計装の無効化を参照してください。

エージェントオーバーヘッドの問題のトラブルシューティング

エージェントオーバーヘッドの問題をトラブルシューティングする際は、以下を実行してください。

  • 最小要件を確認してください。 前提条件を参照してください。
  • Java エージェントの最新の互換バージョンを使用してください。
  • JVM の最新の互換バージョンを使用してください。

エージェントオーバーヘッドを削減するために、以下のアクションを検討してください。

  • アプリケーションがメモリの上限に近づいている場合は、メモリを増やすことを検討してください。
  • アプリケーションが CPU をすべて使用している場合は、水平方向にスケールすることを検討してください。
  • メトリクスの無効化またはチューニングを試してください。
  • トレースサンプリングの設定を調整してスパンの量を削減してください。
  • 特定の計装を無効にしてください。
  • 不要なスパン生成がないか手動計装を見直してください。

エージェントオーバーヘッドの測定に関するガイドライン

自身の環境とデプロイにおいてエージェントオーバーヘッドを測定することで、アプリケーションやサービスのパフォーマンスに対する計装の影響について正確なデータを得ることができます。 以下のガイドラインでは、信頼性のあるエージェントオーバーヘッドの測定値を収集・比較するための一般的な手順を説明します。

測定対象の決定

アプリケーションやサービスのユーザーによって、エージェントオーバーヘッドのどの側面に気づくかは異なる可能性があります。 たとえば、エンドユーザーはサービスレイテンシーの劣化に気づくかもしれませんが、重いワークロードを扱うパワーユーザーは CPU オーバーヘッドにより注意を払います。 一方、弾力的なワークロードなどにより頻繁にデプロイを行うユーザーは、起動時間をより重視します。

データセットに無関係な情報が含まれないよう、ユーザーエクスペリエンスに確実に影響する要因に測定を絞り込んでください。 測定の例として、以下のようなものがあります。

  • ユーザー平均、ユーザーピーク、マシン平均の CPU 使用率
  • 割り当て済み総メモリと最大ヒープ使用量
  • ガベージコレクションの一時停止時間
  • ミリ秒単位の起動時間
  • 平均およびパーセンタイル 95(p95)のサービスレイテンシー
  • ネットワークの読み取りおよび書き込みの平均スループット

適切なテスト環境の準備

管理されたテスト環境でエージェントオーバーヘッドを測定することで、パフォーマンスに影響する要因をより正確に特定できます。 テスト環境を準備する際は、以下を実施してください。

  1. テスト環境の構成が本番環境と類似していることを確認してください。
  2. テスト対象のアプリケーションを、干渉する可能性のある他のサービスから分離してください。
  3. アプリケーションホスト上の不要なシステムサービスをすべて無効にするか削除してください。
  4. アプリケーションがテストワークロードを処理するのに十分なシステムリソースを確保してください。

現実的なテストのバッテリーの作成

テスト環境に対して実行するテストは、可能な限り一般的なワークロードに近づけるように設計してください。 たとえば、サービスの一部の REST API エンドポイントが大量のリクエストを受けやすい場合は、大量のネットワークトラフィックをシミュレートするテストを作成してください。

Java アプリケーションの場合、測定を開始する前にウォームアップフェーズを設けてください。 JVM は高度に動的なマシンであり、Just-In-Time(JIT)コンパイルを通じて多数の最適化を行います。 ウォームアップフェーズにより、アプリケーションのクラスローディングの大部分が完了し、JIT コンパイラーが最適化の大半を実行するための時間が確保されます。

十分な数のリクエストを実行し、テストパスを何度も繰り返してください。 この繰り返しにより、代表的なデータサンプルが確保されます。 テストデータにエラーシナリオを含めてください。 通常のワークロードに近いエラーレートをシミュレートしてください。 一般的には2%から10%です。

比較可能な測定値の収集

パフォーマンスに影響を与えエージェントオーバーヘッドの原因となっている要因を特定するために、同じ環境で単一の要因または条件を変更した後に測定値を収集してください。

エージェントオーバーヘッドデータの分析

複数回の実行からデータを収集した後、結果をチャートにプロットしたり、統計的検定を使用して平均値を比較し、有意な差があるかを確認できます。

スタック、アプリケーション、環境が異なれば、運用特性やエージェントオーバーヘッドの測定結果も異なる可能性があることに留意してください。