Application Real-Time Monitoring Service (ARMS) アプリケーションモニタリングの JVM 監視機能は、指定された期間にわたるさまざまなメモリ メトリックを視覚的に表現します。 これらのチャートはメモリ使用量が多い時間を反映していますが、特定の問題の診断に必要な詳細情報は提供されないため、メモリリークやメモリ肥大化などの問題のトラブルシューティングには役立ちません。 そのためには、メモリ スナップショットを生成し、ログ内の詳細なメモリ使用量データを分析することをお勧めします。
前提条件
2021年9月24日以降にリリースされた Java V2.7.1.2 以降用の ARMS エージェントがインストールされています。
Linux システムを使用しています。 メモリ スナップショットは Linux サーバーでのみサポートされています。
Resource Access Management (RAM) ユーザーに AliyunARMSFullAccess 権限が付与されています。
制限事項
メモリ スナップショット機能は、JVM の組み込みヒープ ダンプ (jmap -dump:all) に基づいて開発されています。 ヒープ ダンプでは追加のメモリが必要になる場合があり、すべての非 JVM スレッドを一時停止させる可能性のあるセーフ ポイントと GC がトリガーされる場合があります。 その結果、アプリケーションは一時停止され、この一時停止を中断することはできません。 したがって、本番環境でこの機能を有効にする前に、関連するリスクを慎重に評価することが不可欠です。
メモリ スナップショット機能には、次の依存関係の制限があります。
ARMS エージェント V2.7.3.5 以前は、JRE、Java 11、または Alpine Linux をサポートしておらず、JAVA_HOME 環境変数と JAVA_HOME/lib/tools.jar ファイルに依存しています。
ARMS エージェント V2.8.3 から V3.2.8 は、JRE、Java 8、Java 11、および Alpine Linux をサポートし、JAVA_HOME 環境変数と Java コマンドに依存しています。
$JAVA_HOME/binを PATH 環境変数に追加する必要があります。ARMS エージェント V3.2.9 以降では、メモリ スナップショット機能が大幅に最適化されています。
$JAVA_HOME/binを PATH 環境変数に追加する必要はありません。 したがって、ARMS エージェントをこれらのバージョンにアップグレードすることをお勧めします。 アップグレードの詳細については、「ARMS エージェントの更新」をご参照ください。
アプリケーションがデプロイされている VPC ネットワークで、アクセスできる Object Storage Service (OSS) バケットの数に制限が設定されている場合は、メモリ スナップショットを保存するバケットを対応するポリシーに追加する必要があります。 バケットの形式: arms-heapdump-<regionId>。 <regionId> はリージョンの ID に置き換えます。 たとえば、アプリケーションが中国 (杭州) リージョンにデプロイされている場合、バケット名は arms-heapdump-cn-hangzhou です。
説明メモリ スナップショット機能は、アプリケーション インスタンスによって収集されたスナップショット データを、指定された OSS バケットにアップロードして保存および処理します。 ポリシーで OSS バケットを指定しないと、データは想定どおりに収集されません。
以前は、履歴スナップショットの保存期間は無制限でした。 ただし、2023年7月1日以降、ARMS は履歴スナップショットの保存期間を90日に制限しています。つまり、90日以上前に作成したメモリ スナップショットは保存できません。 データの損失を防ぐために、定期的にバックアップすることをお勧めします。
メモリ スナップショットの作成
ARMS コンソール にログインします。 左側のナビゲーション ウィンドウで、 を選択します。
[アプリケーションリスト] ページで、上部のナビゲーションバーでリージョンを選択し、管理するアプリケーションの名前をクリックします。
説明[言語] 列のアイコンは、アプリケーションのプログラミング言語を示しています。
: Java
: Go
: Python- (ハイフン): Managed Service for OpenTelemetry で監視されるアプリケーション
左側のナビゲーション ウィンドウで、[アプリケーションの詳細] をクリックします。 表示されるページで、[JVM 監視] タブをクリックします。
[JVM 監視] タブの右上隅にある [メモリ スナップショットの作成] をクリックします。
[メモリ スナップショットの作成] ダイアログボックスで、IP アドレスを選択し、[保存] をクリックします。
説明[アプリケーションの詳細] ページの左側のナビゲーションツリーでインスタンスを選択した場合、インスタンスの IP アドレスが [IP] ドロップダウンリストから自動的に選択されます。
表示されるメッセージで、[強制ダンプ] をクリックします。
重要メモリ スナップショット タスクの所要時間は、数分から約30分までさまざまです。 強制ダンプを実行すると、アプリケーション プロセスが応答しなくなるため、注意して進めてください。
メモリ スナップショットの詳細の表示
[JVM 監視] タブの右上隅にある [履歴スナップショット] をクリックします。
[スナップショット ジョブの数] パネルに、タスクの実行ステータスが表示されます。 緑色はスナップショット タスクが成功したことを意味し、青色は実行中であることを意味し、赤色は失敗したことを意味します。 タスクを見つけて [詳細] をクリックすると、タスクの進捗状況が表示されます。
タスクを見つけて [分析] をクリックすると、Application Troubleshooting Platform (ATP) コンソールに分析結果が表示されます。
FAQ
アプリケーションで OOM エラーが発生する前に、スナップショットを自動的に作成および分析できないのはなぜですか?
アプリケーションがメモリ不足 (OOM) 状態に近づくと、システム リソースが危機的に逼迫することがよくあります。 この期間中にリソースを大量に消費する操作であるスナップショットを作成すると、OOM エラーが発生する可能性があります。 スナップショットを安全に生成および分析するには、次の手順に従います。
アプリケーションに次のパラメーターを設定します。 OOM エラーが発生すると、JVM は
/tmp/heap.binにメモリ スナップショットを自動的に作成します。Kubernetes 環境では、
/tmp/heap.binパスを外部ストレージ ボリュームにマップして、ポッドの再起動によるファイルの損失を防ぎます。-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/heap.binメモリ スナップショットを OSS インスタンスにアップロードします。 詳細については、「OSS の使用を開始する」をご参照ください。
ATP プラットフォームを使用して、メモリ スナップショットを分析します。