Application Real-Time Monitoring Service(ARMS)エージェントは、アプリケーションの実行中にバイトコードを拡張して、アプリケーションのパフォーマンスを管理します。 バイトコード拡張によって実装される他のパフォーマンス管理ソリューションと同様に、Java 向け ARMS エージェントは、ある程度のパフォーマンスオーバーヘッドをもたらします。 ただし、ARMS チームは、アプリケーションの安定性を損なうことなく、エージェントのパフォーマンスオーバーヘッドを削減するための多くの手法を採用しています。 このテストレポートでは、トラフィックの異なるシナリオをシミュレートして、Java V4.x 向け ARMS エージェントのパフォーマンスオーバーヘッドをテストします。 アプリケーションをアプリケーションモニタリングに接続する前に、このレポートを参照して包括的な評価を実行することをお勧めします。
テストシナリオ
フローチャート
Spring Web モデル - ビュー - コントローラー(MVC)で開発された Java アプリケーションは、Alibaba Cloud Performance Testing(PTS)から送信されたリクエストに基づいて、Druid フレームワークと Jedis フレームワークを介して MySQL と Redis にアクセスします。
${mall-gateway}/case/api/v1/mysql/executeリクエストを受信すると、アプリケーションは MySQL にアクセスします。 アプリケーションはこのリクエストを受信するたびに、1 ~ 4 回 MySQL にアクセスします。${mall-gateway}/case/api/v1/redis/executeリクエストを受信すると、アプリケーションは Redis にアクセスします。 アプリケーションはこのリクエストを受信するたびに、1 ~ 10 回 Redis にアクセスします。
テスト環境
ストレステストソースは PTS によって提供されます。
Java アプリケーション、MySQL、および Redis はすべて、同じ Alibaba Cloud Container Service for Kubernetes(ACK)クラスターにデプロイされています。 ノードのインスタンスタイプは ecs.u1-c1m2.8xlarge で、ノードのオペレーティングシステムバージョンは Alibaba Cloud Linux 2.1903 LTS 64 ビットです。
アプリケーションの各ポッドには、2 コア、4 GB のメモリ、および 2 つのレプリカがあります。 JVM パラメーターは次のとおりです。
-Xms3500m -Xmx3500m -XX:MetaspaceSize=500mJava 向け ARMS エージェントのバージョンは 4.2.1 です。
テスト手順
500、1,000、2,000 QPS で 3 つのストレステストを実行します。 各ストレステストは 1 時間続きます。 各ストレステストの前に、Java アプリケーションを 100 QPS で 3 分間ウォームアップします。 テスト結果は、ベースラインパフォーマンスメトリックとして使用されます。
Java V4.1.11 向け ARMS エージェントをインストールします。 サンプリングポリシーで 10% のサンプリングレートを設定し、手順 1 のストレステストを繰り返して、Java アプリケーションの CPU オーバーヘッド、メモリオーバーヘッド、および応答時間の差異を比較します。
Java V4.1.11 向け ARMS エージェントをインストールします。 サンプリングポリシーで 100% のサンプリングレートを設定し、手順 1 のストレステストを繰り返して、Java アプリケーションの CPU オーバーヘッド、メモリオーバーヘッド、および応答時間の差異を比較します。
サンプリングポリシーの設定方法の詳細については、「ARMS エージェント V3.2.8 以降のトレースサンプリングモードを選択する」をご参照ください。
メトリック、トレース、分位数など、アプリケーションモニタリングの基本機能が有効になっています。 すべてのプラグインも有効になっています。 トレース圧縮、URL 収束、データマスキング、継続的プロファイリングなど、一部の高度な機能は一時的に無効になっています。
ベースラインパフォーマンスメトリック
項目 | CPU | メモリ | 応答時間(単位:ミリ秒) |
500 QPS | 6.737% | 11.51% | 57.6 |
1,000 QPS | 13.040% | 11.81% | 63.9 |
2,000 QPS | 26.796% | 12.19% | 70.5 |
CPU メトリックは、ポッドによって使用される CPU の総 CPU(2 コア)に対する割合を表します。
メモリメトリックは、ポッドによって使用されるメモリの総メモリに対する割合を表します。 ポッドによって使用されるメモリは、リクエスト値に達するまで自然に増加するため、レポートではストレステストの終了時の実際のメモリ使用量を使用します。
応答時間メトリックは、リクエストの平均応答時間を表します。 単位:ミリ秒。
Java V4.x 向け ARMS エージェントのパフォーマンスメトリック
項目 | 10% サンプリングレート | 100% サンプリングレート | ||||
CPU | メモリ | 応答時間(単位:ミリ秒) | CPU | メモリ | 応答時間(単位:ミリ秒) | |
500 QPS | 8.412% | 13.72% | 58.5 | 9.316% | 13.91% | 58.7 |
1,000 QPS | 16.947% | 14.14% | 64.9 | 18.114% | 14.42% | 65.3 |
2,000 QPS | 34.850% | 14.64% | 74.6 | 35.945% | 14.67% | 76.1 |
サンプリングレートと CPU および QPS の関係は非線形です。 デフォルトでは、1 秒あたりのトレース収集に上限があります。
Java V4.x 向け ARMS エージェントのパフォーマンスオーバーヘッド
項目 | 10% サンプリングレート | 100% サンプリングレート | ||||
CPU | メモリ | 応答時間(単位:ミリ秒) | CPU | メモリ | 応答時間(単位:ミリ秒) | |
500 QPS | +1.68% | +2.21% | +0.9 | +2.58% | +2.40% | +1.1 |
1,000 QPS | +3.907% | +2.33% | +1.0 | +5.07% | +2.61% | +1.4 |
2,000 QPS | +8.05% | +2.45% | +4.1 | +9.14% | +2.48% | +5.6 |
結論
Java V4.x 向け ARMS エージェントによって引き起こされる追加の CPU およびメモリオーバーヘッドは 10% 以内です。
Java V4.x 向け ARMS エージェントは、応答時間(10%)への影響は小さく、1,000 QPS では 1 ミリ秒しか増加しません。
100% の固定サンプリングレートでのパフォーマンスオーバーヘッドは、10% の固定サンプリングレートでのパフォーマンスオーバーヘッドよりもわずかに大きくなります。