Java アプリケーションが複数のインスタンスで実行されている場合、どのインスタンスがパフォーマンスの低下やメモリプレッシャーを引き起こしているかを特定するには、インスタンスレベルの可視性が必要です。ARMS エージェントをインストールすると、ARMS はインスタンスごとにインフラストラクチャ、ガベージコレクション (GC)、および JVM メモリメトリックを自動的に収集します。[インスタンスモニタリング] ページを使用して、ツールを切り替えることなく、インスタンスの正常性を比較し、ボトルネックを特定し、メモリの問題を診断します。
前提条件
アプリケーションに ARMS エージェントがインストールされていること。
アプリケーション監視は、新しい課金モードを有効にしたユーザー向けに、新しいアプリケーション詳細ページを提供します。新しい課金モードを有効にしていない場合は、[アプリケーション一覧] ページで [新バージョンに切り替える] をクリックすると、新しいアプリケーション詳細ページにアクセスできます。
インスタンス監視ページの表示
ARMS コンソールにログインします。 左側のナビゲーションペインで、[アプリケーション監視] > [アプリケーションリスト] を選択します。
ページ上部でリージョンを選択し、アプリケーション名をクリックします。
上部のナビゲーションバーで、[インスタンスモニタリング] をクリックします。
[言語] 列のアイコンは、統合方法を示しています:
アプリケーションモニタリングと統合された Java アプリケーション
アプリケーションモニタリングと統合された Golang アプリケーション
アプリケーションモニタリングと統合された Python アプリケーション[-] Managed Service for OpenTelemetry と統合されたアプリケーション
ダッシュボードのレイアウト
[インスタンスモニタリング] ダッシュボードは、デプロイ環境 (ECS またはコンテナ) に応じて、情報を 3 つのエリアに整理します。
| エリア | 説明 |
|---|---|
| クイックフィルター (1) | ホストアドレス (および Managed Service for Prometheus を使用したコンテナ環境ではクラスタ) でグラフとインスタンスリストをフィルタリングします。 |
| トレンドグラフ (2) | インフラストラクチャメトリクス、GC、および JVM メモリの時系列グラフを表示します。 |
| インスタンスリスト (3) | インスタンスごとのメトリクスを表示し、インスタンスの詳細またはトレースにアクセスします。 |
環境別のメトリクス
利用可能なメトリクスは、アプリケーションが ECS で実行されているか、コンテナで実行されているか、およびコンテナ環境が Managed Service for Prometheus と統合されているかどうかによって異なります。
トレンドグラフのメトリクス:
| メトリクスカテゴリ | ECS | コンテナ (Prometheus) | コンテナ (ARMS 自己収集) |
|---|---|---|---|
| CPU 使用率 | あり | あり | あり |
| メモリ使用率 | あり | あり | あり |
| ディスク使用率 | あり | なし | なし |
| Full GC および Young GC | あり | あり | あり |
| ヒープメモリおよび非ヒープメモリ | あり | あり | あり |
ECS 環境では、各インフラストラクチャグラフのタイトルの横にあるドロップダウンリストを使用して、平均値と最大値を切り替えることができます。
GC グラフでは、GC 回数と平均 GC 時間を切り替えます。JVM メモリグラフでは、ヒープメモリと非ヒープメモリのビューを切り替えます。
インスタンスリストの列:
| 列 | ECS | コンテナ (Prometheus) | コンテナ (ARMS 自己収集) |
|---|---|---|---|
| インスタンス IP | あり | あり | あり |
| CPU 使用率 | あり | あり (+ request、limit) | あり (使用量のみ) |
| メモリ使用率 | あり | あり (+ request、limit) | あり (使用量のみ) |
| ディスク使用率 | あり | あり (+ limit) | なし |
| 負荷 | あり | あり | あり |
| Full GC 回数 | あり | あり | あり |
| Young GC 回数 | あり | あり | あり |
| ヒープメモリ使用量 | あり | あり | あり |
| 非ヒープメモリ使用量 | あり | あり | あり |
| RED メトリクス (リクエスト、エラー、平均応答時間) | あり | あり | あり |
コンテナ (Prometheus) 環境では、リソースに制限が設定されていない場合、CPU 使用率、メモリ使用率、およびディスク使用率に [-] が表示されます。
コンテナ環境の要件:
Managed Service for Prometheus を使用する場合:コンテナメトリクスは Managed Service for Prometheus から取得されます。統合を設定するには、「Container Observability」をご参照ください。
Managed Service for Prometheus を使用しない場合:アプリケーションモニタリングプローブをバージョン 4.1.0 以降にアップグレードしてください。以前のプローブバージョンでは、基本的なコンテナメトリクスが報告されません。プローブバージョンの詳細については、「プローブ (Java Agent) バージョンガイド」をご参照ください。
グラフの操作
各トレンドグラフは、次の 2 つのアクションをサポートしています。
をクリックして、期間のメトリクス統計を表示、または異なる日付の同じ期間を比較します。
をクリックして、縦棒グラフとトレンドグラフを切り替えます。
インスタンスリストのアクション
インスタンス詳細を開くには、インスタンス IP (またはコンテナ環境の場合は [アクション] 列の [詳細]) をクリックします。
[アクション] 列の [トレース] をクリックして、トレース詳細を表示します。 詳細については、「トレース分析」をご参照ください。
ARMS は JMX を通じて JVM メトリクスを収集します。ARMS が報告する非ヒープメモリ領域は、実際の Java プロセスのものより少なくなります。その結果、ARMS のヒープメモリと非ヒープメモリの合計は、top コマンドで表示される RES 値とは異なる場合があります。詳細については、「JVM 監視メモリの詳細」をご参照ください。
インスタンスの詳細
インスタンス IP をクリックすると、次のタブを含む詳細ページが開きます。
概要
[概要] タブには、選択されたインターフェースのリクエスト数、エラー数、平均レスポンス時間、および低速コール情報が表示されます。
左側の [ホストリスト] でホストを切り替えて、モニタリングデータを表示できます。サマリーカードには、前日比のパーセンテージ変化が表示されます。カードの下にある時系列トレンドチャートには、Requests/1m、Errors/1m、および Response Time/1m が 1 分単位で表示されます。このページには、[JVM モニタリング]、[ホストモニタリング]、および [トレース分析] タブも含まれています。
JVM 監視
[JVM モニタリング] タブには、選択されたインスタンスの GC、メモリ、スレッド、およびファイル記述子のメトリクスが表示されます。
GC セクションには、「Full GC 回数/1分」、「Young GC 回数/1分」、「Full GC トリガー理由/1分」、および 「Young GC トリガー理由/1分」 のグラフが含まれています。メモリセクションには、「メモリ使用量分布/1分」、「ヒープメモリ/1分」、「ヒープメモリ (使用量)/1分」、およびその他のグラフが含まれています。左側のパネルでは、特定のアプリケーションインスタンスを選択して、その監視データを表示できます。
スレッドプール監視
スレッドプール監視は、コアスレッド構成、アクティブスレッドステータス、およびタスク実行メトリクスを追跡します。タブの上部でタイプと名前でスレッドプールをフィルタリングできます。
プローブバージョン 4.1.x 以降
サポートされているフレームワーク:
| フレームワーククラス | 一般的な用途 |
|---|---|
java.util.ThreadPoolExecutor | Tomcat 8 ~ 9.1、Dubbo、HSF、Vert.x、カスタムスレッドプール |
org.apache.tomcat.util.threads.ThreadPoolExecutor | Tomcat 9.1 以降 |
org.eclipse.jetty.util.thread.QueuedThreadPool | Jetty |
org.xnio.XnioWorker | Undertow |
収集されるメトリクス:
| メトリクス | ThreadPoolExecutor (JDK) | ThreadPoolExecutor (Tomcat 9.1+) | QueuedThreadPool | XnioWorker |
|---|---|---|---|---|
arms_thread_pool_core_pool_size | あり | あり | あり | あり |
arms_thread_pool_max_pool_size | あり | あり | あり | あり |
arms_thread_pool_active_thread_count | あり | あり | あり | あり |
arms_thread_pool_current_thread_count | あり | あり | あり | -- |
arms_thread_pool_max_thread_count | あり | あり | -- | -- |
arms_thread_pool_scheduled_task_count | あり | あり | -- | -- |
arms_thread_pool_completed_task_count | あり | あり | -- | -- |
arms_thread_pool_rejected_task_count | あり | あり | あり | -- |
arms_thread_pool_queue_size | あり | あり | あり | あり |
プローブバージョン 4.1.x より前
サポートされているフレームワーク:Tomcat、HSF、Dubbo、Vert.x、および Undertow。エージェントバージョン 3.1.x 以前は、Undertow 1.x ~ 2.0.x のみをサポートしています。エージェントバージョン 3.2.x 以降は、すべての Undertow バージョンをサポートしています。
| メトリクス | 説明 |
|---|---|
arms_threadpool_core_size | コアスレッド数 |
arms_threadpool_max_size | 最大スレッド数 |
arms_threadpool_active_size | アクティブスレッド数 |
arms_threadpool_queue_size | キューサイズ |
arms_threadpool_current_size | 現在のプールサイズ |
SchedulerX スレッドプールは、arms_threadpool_active_size のみを報告します。
コネクションプール監視
コネクションプール監視は、初期化構成とランタイム接続ステータスを追跡します。タブの上部でタイプでコネクションプールをフィルタリングできます。
プローブバージョン 4.1.x 以降
サポートされているフレームワーク:DBCP (>2.0)、Vibur DBCP (>11.0)、c3p0 (>0.9.2)、Druid、HikariCP (>3.0)、Jedis (>3.0)、Lettuce (>5.0)、Redisson (>3.0)、tomcat-dbcp (>8.0)、tomcat-jdbc (>8.0)。
収集されるメトリクス:
| メトリクス | 説明 | サポートされているフレームワーク |
|---|---|---|
arms_connection_pool_connection_count | 接続数 (状態別のアクティブとアイドル) | DBCP、c3p0、Vibur DBCP、Druid、HikariCP、Jedis、Lettuce、Redisson、tomcat-dbcp、tomcat-jdbc |
arms_connection_pool_connection_min_idle_count | 最小アイドル接続数 (静的設定) | DBCP、Jedis、Druid、HikariCP、Lettuce、tomcat-dbcp、tomcat-jdbc |
arms_connection_pool_connection_max_idle_count | 最大アイドル接続数 (静的設定) | DBCP、Jedis、Druid、Lettuce、tomcat-dbcp、tomcat-jdbc |
arms_connection_pool_connection_max_count | 最大接続数 (静的設定) | DBCP、Druid、Vibur DBCP、HikariCP、tomcat-dbcp、tomcat-jdbc |
arms_connection_pool_pending_request_count | ブロックされた接続リクエスト | c3p0、HikariCP、Jedis、tomcat-dbcp、tomcat-jdbc |
プローブバージョン 4.1.x より前
| フレームワーク | 収集されるメトリクス |
|---|---|
| okHttp2 / okHttp3 | arms_connection_pool_active_count、arms_connection_pool_connection_count |
| Apache HttpClient | arms_connection_pool_connection_count、arms_connection_pool_max_count、arms_connection_pool_pending_request_count |
| Druid | arms_connection_pool_active_count、arms_connection_pool_max_count |
| HikariCP | arms_connection_pool_active_count、arms_connection_pool_max_count |
ホスト監視
[ホストモニタリング] タブには、CPU、メモリ、ディスク、ロード、ネットワークトラフィック、ネットワークパケットのメトリクスが表示されます。

コンテナ監視
[コンテナモニタリング] タブには、コンテナレベルのリソースメトリックが表示されます。利用できるメトリックは、統合方法によって異なります。
| 統合 | メトリクス | セットアップ |
|---|---|---|
| Managed Service for Prometheus | CPU、メモリ、ディスク、負荷、ネットワークトラフィック、ネットワークパケット | 「Prometheus instance for Container Service」をご参照ください |
| ARMS 自己収集 (プローブ 4.1.0+) | CPU、メモリ、ネットワークトラフィック | プローブを 4.1.0 以降にアップグレードしてください。「プローブ (Java Agent) バージョンガイド」をご参照ください |
[コンテナモニタリング] タブの「概要」エリアには、名前空間、クラスター、CPU (コア) とメモリの平均/最大/最新/制限に関する概要メトリクスが表示されます。その下の「リソース」エリアには、以下の 4 つの折れ線グラフが含まれています。
メモリ/制限 (%)
メモリ使用量
CPU 使用率 (%)
コア別 CPU 使用率 (ユーザー/システム/合計の曲線)
トレース分析
トレース分析は、保存されたトレースデータをリアルタイムでクエリします。フィルタと集計ディメンションを組み合わせて、さまざまなシナリオでパフォーマンスの問題を診断します。詳細については、「トレース分析」をご参照ください。
トレーシングコンソールで、serviceName: "mall-gateway" などの検索条件を入力してトレースデータをクエリします。このページには次の内容が含まれています。
左側のクイックフィルタパネル:[Status]、[Duration] (スライダー範囲 0 ns ~ 5 s)、[Interface Name]、および [Host Address] でフィルタリングできます。
上部の統計グラフ:[Call Count] ヒストグラム、[Errors/HTTP Errors] ヒストグラム、[Average Duration] 折れ線グラフ。
下部スパンのデータテーブルの列には、トレース ID、インターフェース名、アプリケーション名、期間、ステータス、開始時刻、ホストアドレス があります。[詳細] または [ログ] をクリックすると、トレース詳細を表示できます。
右側の[低速トレース分析]パネル: 所要時間への貢献度順に上位の spanName を表示します。
インスタンスレベルからアプリケーションレベルへのメトリクス集計
ARMS がインスタンスレベルのメトリクスをアプリケーションレベルの値に集計する際、メトリクスのタイプに応じて異なる方法を使用します。
| メトリクスタイプ | 集計方法 |
|---|---|
| RED:リクエスト数、低速呼び出し数、HTTP ステータスコード数 | 合計 |
| RED:応答時間 | 平均 |
| JVM:GC 回数、GC 時間 | 合計 |
| JVM:ヒープメモリ、スレッド数 | 最大 |
| スレッドプールとコネクションプール:すべてのメトリクス | 平均 |
| システムメトリクス:すべてのメトリクス | 最大 |
| SQL および NoSQL:呼び出し数 | 合計 |
| SQL および NoSQL:その他のメトリクス | 平均 |
| 例外:すべてのメトリクス | 合計 |
関連ドキュメント
アプリケーションモニタリングメトリクスの完全なリストについては、「Application Monitoring metrics reference」をご参照ください。
よくある質問
インスタンス間でトラフィックが不均等なのはなぜですか?
プローブバージョン 3.x では、メモリ最適化を有効にすると、一部のメトリクスが欠落する場合があります。プローブバージョン 4.x にアップグレードしてください。
単一の Undertow リクエストが 2 回カウントされるのはなぜですか?
プローブバージョン 3.2.x より前では、DeferredResult のインストルメンテーションにより、1 回の呼び出しが 2 回記録されます。プローブバージョン 3.2.x 以降にアップグレードしてください。
コンテナ監視の CPU またはメモリのクォータが Pod の設定と一致しないのはなぜですか?
Pod が複数のコンテナを定義しているかどうかを確認してください。このメトリクスは、Pod 内のすべてのコンテナのクォータの合計です。
一部のシステムメトリクスが欠落している、不正確である、または CPU 使用率が 100% と表示されるのはなぜですか?
プローブバージョン 4.x より前では、Windows でシステムメトリクスを収集しません。プローブバージョン 4.x 以降にアップグレードしてください。
アプリケーション起動直後に Full GC が発生するのはなぜですか?
デフォルトのメタスペースサイズは約 20 MB です。起動時にメタスペースが拡張され、Full GC がトリガーされます。-XX:MetaspaceSize および -XX:MaxMetaspaceSize パラメータを使用して、初期および最大メタスペースサイズを設定してください。
VM Stack はどのように計算されますか?
VM Stack は、稼働中のスレッド数に 1 MB (デフォルトのスレッドスタックサイズ) を掛けて計算されます。-Xss で異なるスタックサイズを設定した場合、このメトリクスは実際の値と一致しない可能性があります。
state=live には、live、blocked、new、runnable、timed-wait、および wait の状態が含まれます。
JVM メトリクスはどのように収集されますか?
ARMS は、標準の JDK インターフェイスを使用して JVM メトリクスを取得します。
メモリメトリクス:
ManagementFactory.getMemoryPoolMXBeansjava.lang.management.MemoryPoolMXBean#getUsage
GC メトリクス (プローブ 4.4.0 より前):
ManagementFactory.getGarbageCollectorMXBeansGarbageCollectorMXBean#getCollectionCountGarbageCollectorMXBean#getCollectionTime
GC メトリクス (プローブ 4.4.0 以降):
GarbageCollectionNotificationInfo イベントを GarbageCollectorMXBean からサブスクライブすることで取得されます。
JVM の最大ヒープメモリ値が -1 なのはなぜですか?
値が -1 の場合、最大ヒープサイズが設定されていないことを意味します。-Xmx パラメータを使用して設定してください。
JVM ヒープメモリ使用量が最大ヒープメモリサイズと等しくないのはなぜですか?
-Xms パラメータは初期ヒープサイズを設定します。JVM は必要に応じてヒープを拡張し、-Xmx で設定された最大値に達します。不一致は、ヒープがまだ完全に拡張されていないことを意味します。
JVM GC の頻度が徐々に増加するのはなぜですか?
これは通常、JDK 8 のデフォルト GC アルゴリズムである ParallelGC で発生します。ParallelGC はデフォルトで -XX:+UseAdaptiveSizePolicy を有効にし、ヒープサイズを動的に調整します。Young GC が頻繁に実行されると、サバイバー領域が縮小し、オブジェクトが旧世代により早く昇格する可能性があります。これにより、旧世代の成長が加速し、より頻繁な Full GC がトリガーされます。詳細については、Java GC Ergonomics のドキュメントをご参照ください。
スレッドプールまたはコネクションプール監視のデータがないのはなぜですか?
[カスタム設定]ページで、[詳細設定]で、スレッドプールと接続プールの監視が有効になっていることを確認します。
「Thread pool and connection pool monitoring」をご参照のうえ、お使いのフレームワークがサポート対象であることを確認してください。
HikariCP の最大接続数が期待値と一致しないのはなぜですか?
プローブバージョン 3.2.x より前では、最大接続数を正しく取得できません。プローブバージョン 3.2.x 以降にアップグレードしてください。
プール監視メトリクスが小数値として表示されるのはなぜですか?
プローブは 15 秒ごとにデータを収集します。コンソールには、選択した期間の平均値が表示されます。たとえば、1 分間の 4 つのデータポイントが 0、0、1、および 0 の場合、表示される値は 0.25 です。
スレッドプールまたはコネクションプールがいっぱいなのに、監視に変化が表示されないのはなぜですか?
ARMS は 15 秒ごとにスレッドプールとコネクションプールのメトリクスを収集します。この間隔内の短期的なスパイクはキャプチャされない場合があります。
スレッドプールの最大スレッド数が予期しない値または 21 億と表示されるのはなぜですか?
ARMS は、スレッドプールオブジェクトから最大スレッド数を直接読み取ります。21 億という値は、通常、スケジュールされたスレッドプールを示しており、デフォルトで Integer.MAX_VALUE に設定されています。
/**
* 指定されたコアプールサイズで新しい ScheduledThreadPoolExecutor を作成します。
* @param corePoolSize アイドル状態でもプールに保持するスレッドの数
* (allowCoreThreadTimeOut が設定されていない場合)
* @throws IllegalArgumentException corePoolSize < 0 の場合
*/
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
new DelayedWorkQueue());
}
/**
* 指定された初期パラメータで新しい ScheduledThreadPoolExecutor を作成します。
* @param corePoolSize アイドル状態でもプールに保持するスレッドの数
* (allowCoreThreadTimeOut が設定されていない場合)
* @param threadFactory エグゼキュータが新しいスレッドを作成する際に使用するファクトリ
* @throws IllegalArgumentException corePoolSize < 0 の場合
* @throws NullPointerException threadFactory が null の場合
*/
public ScheduledThreadPoolExecutor(int corePoolSize,
ThreadFactory threadFactory) {
super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
new DelayedWorkQueue(), threadFactory);
}
Tomcat スレッドプールメトリクスが期待値と一致しないのはなぜですか?
複数のメトリクス (最大スレッド数、アクティブスレッド数、コアスレッド数) がすべて期待値と異なる場合は、アプリケーションが複数のポートで Tomcat サービスを公開しているかどうかを確認してください。たとえば、Spring Actuator はメトリクス用に追加のポートを開きます。この場合、ARMS はディメンション収束により複数のスレッドプールのメトリクスをマージする可能性があります。
これを修正するには、probe をバージョン 4.1.10 以降にアップグレードします。 次に、[アプリケーション設定] > [カスタム設定] > [プーリング監視設定] に移動し、[スレッドプールのスレッド名パターンの抽出ストラテジー] を Replace trailing digits with * に設定します。
特定の時刻より前にスレッドプールまたはコネクションプールのデータがないのはなぜですか?
これは、スケジュールされたタスクがプールを作成する場合に発生します。データは、タスクがプールを初期化した後にのみ表示されます。API リクエスト数などのトラフィックベースのメトリクスも同様に動作します。
HttpClient コネクションプールのデータがないのはなぜですか?
ARMS プローブバージョン 4.x 以降、OkHttp3 および Apache HttpClient のコネクションプール監視はサポートされなくなりました。これらのフレームワークは、外部ドメインごとに個別のコネクションプールを作成します。多数のドメインが関与する場合、これにより過度のオーバーヘッドと安定性のリスクが発生します。
ACK アプリケーションを統合した後、コンテナ監視データがないのはなぜですか?
ARMS は、同じ Alibaba Cloud アカウント下のリソースに対してのみコンテナ監視データを表示します。ACK クラスタの作成に使用したアカウントが、ARMS 統合に使用したアカウントと一致することを確認してください。
ファイルハンドルのオープン率がゼロ以外なのに、ファイルハンドル数がゼロなのはなぜですか?
「Upgrade the ARMS agent」をご参照のうえ、プローブをバージョン 4.2.2 以降にアップグレードしてください。これは、ARMS プローブバージョン 3.x を使用して JDK 9 以降で発生します。
JVM プロセスの物理メモリ使用量が JVM 監視のヒープメモリ使用量と大きく異なるのはなぜですか?
JVM プロセスは、ARMS が完全には監視していない大量のオフヒープメモリを使用している可能性があります。ARMS がカバーする JVM メモリ領域の詳細については、「JVM 監視メモリの詳細」をご参照ください。
Druid が最大アイドル接続設定よりも多くのアイドル接続を表示するのはなぜですか?
Druid の MaxIdle パラメータは、DBCP 移行互換性のためにのみ存在します。機能的な効果はありません。
一部のインスタンスを最新のプローブバージョンにアップグレードした後、データがないのはなぜですか?
プローブバージョン 4.1.x より前からアップグレードする場合、すべてのインスタンスをアップグレードする必要があります。すべてのインスタンスが同じバージョンで実行されると、ページは自動的に適応します。