Arthasは、開発者がJavaアプリケーションのオンライン問題を診断できるツールです。バイトコード拡張技術を採用しているため、実行中のJava仮想マシン(JVM)プロセスを再起動する必要なく、アプリケーションの状態を確認できます。Enterprise Distributed Application Service(EDAS)コンソールは、Arthasの一般的な機能をサポートしています。このような機能には、JVMの概要、スレッドの時間消費分析、関数実行の分析、パフォーマンス分析が含まれます。
前提条件
Arthasを使用してアプリケーションを診断する前に、次の要件が満たされていることを確認してください。- EDASアプリケーションがKubernetesクラスターにデプロイされていること。説明 この例では、Container Service for Kubernetes(ACK)クラスターが使用されています。
- アプリケーションがJavaで開発されていること。
- ポート 3658 または 8563 が使用されていないこと。
背景情報
Arthasは、Alibaba Cloudによって開発されたオープンソースのJava診断ツールです。開発者の間で人気があります。Arthasの詳細については、Arthasドキュメントをご参照ください。
arms-pilotを更新してアプリケーションを再起動する
ACKクラスターのarms-pilotを更新してアプリケーションを再起動するには、次の手順を実行します。
- arms-pilotを更新します。
- ACKコンソールにログインします。
- 左側のナビゲーションペインで、[クラスター]をクリックします。
- [クラスター]ページで、管理するクラスターの名前をクリックするか、クラスターの詳細[アクション]列のをクリックします。
- 左側のナビゲーションペインで、を選択します。
- [デプロイメント]ページで、[名前空間]ドロップダウンリストからarms-pilot-systemまたはarms-pilotを選択します。
- arms-pilot-ack-arms-pilotという名前のデプロイメントを見つけ、[アクション]列のを選択します。
- [再デプロイ]メッセージで、[確認]をクリックします。
- クラスターに mse-pilot がインストールされている場合は、arms-pilot を更新した後に mse-pilot を更新する必要があります。
- [デプロイメント]ページで、[名前空間]ドロップダウンリストからmse-pilotを選択します。
- arms-pilot-ack-arms-pilotという名前のデプロイメントを見つけ、編集[アクション]列のをクリックします。
- [編集]ページで、イメージタグを v1.29 に設定します。次に、[更新]をクリックします。
重要 mse-pilotの更新はアプリケーションに影響を与えません。ただし、mse-pilotの更新中は、アプリケーションをリリース、再起動、またはロールバックしないことをお勧めします。 - 監視対象アプリケーションのプロセスID(PID)が 1 の場合は、アプリケーションのYAML構成ファイルを変更します。
- [デプロイメント]ページで、[名前空間]ドロップダウンリストからアプリケーションの名前空間を選択します。管理するデプロイメントを見つけ、[アクション]列のを選択します。
- [YAMLの編集]ダイアログボックスで、spec > template > metadata > annotationsに次の情報を追加します:ArthasEnable: 'on'。次に、[更新]をクリックします。説明 注釈metadataに注釈:ArthasEnable: 'オン'セクションがない場合は、を追加する前にを追加する必要があります。

- アプリケーションを再起動します。
- [デプロイメント]ページで、[名前空間]ドロップダウンリストからアプリケーションの名前空間を選択します。管理するデプロイメントを見つけ、[アクション]列のを選択します。
- [再デプロイ]メッセージで、[確認]をクリックします。
Arthas診断ページに移動する
EDASコンソールEDAS consoleにログインします。
左側のナビゲーションペインで、[アプリケーション管理] > [アプリケーション]を選択します。上部のナビゲーションバーで、リージョンを選択し、[マイクロサービス名前空間]ドロップダウンリストからマイクロサービス名前空間を選択し、[クラスタータイプ]ドロップダウンリストから[kubernetesクラスター]を選択し、目的のアプリケーションの[名前]をクリックします。
- アプリケーション詳細ページの左側のナビゲーションペインで、を選択します。
- Arthas診断ページで、アプリケーションのPodを選択します。
- Arthasがダウンロードされていない場合は、Application Real-Time Monitoring Service(ARMS)エージェントを再デプロイしてArthasをダウンロードする必要があります。詳細については、手順 1 をご参照ください。
- Arthasがマウントされていない場合、EDASはアプリケーションを自動的に再デプロイして、Arthasをアプリケーションにマウントします。アプリケーションを手動で再デプロイする方法の詳細については、手順 4 をご参照ください。
- Arthasのマウントに失敗した場合は、アプリケーションのPIDを確認し、必要に応じて次のいずれかの操作を実行する必要があります。
- アプリケーションPIDが 1 の場合は、アプリケーションのYAML構成ファイルを変更します。詳細については、手順 3 をご参照ください。
- アプリケーションPIDが 1 でない場合は、EDASテクニカルサポートにお問い合わせください。
JVM概要タブ
JVM概要タブでは、JVMメモリの統計情報、オペレーティングシステムと変数に関する情報など、アプリケーションに関するJVM情報を表示できます。このタブは、アプリケーションのJVMの概要を提供します。
- JVMメモリ:ヒープメモリと非ヒープメモリの使用状況、ガベージコレクション(GC)に関する情報など、JVMメモリに関する情報。
- オペレーティングシステム情報:平均システム負荷、オペレーティングシステムの名前とバージョン、Javaバージョンなど、オペレーティングシステムに関する情報。
- 変数情報:システム変数と環境変数に関する情報。
- オプション:スレッド TOP-10:CPU使用率が最も高い 10 個のスレッドに関する情報。各スレッドの名前、ID、CPU使用率、ステータスが含まれます。
スレッドに関するスタック情報を表示するには、スレッドの[アクション]列の[表示]をクリックします。
スレッド時間消費分析タブ
スレッド時間消費分析タブでは、アプリケーションのすべてのスレッドと各スレッドのスタック情報を表示できます。このタブは、長時間消費するスレッドを効率的に特定するのに役立ちます。
- Arthas診断ページで、[スレッド時間消費分析]タブをクリックします。[スレッド時間消費分析]タブには、CPU使用率の降順でソートされたアプリケーションのすべてのスレッドが表示されます。このタブには、名前、ID、CPU使用率、ステータスなど、各スレッドの詳細も表示されます。
- スレッドに関するスタック情報を表示するには、スレッドの表示[アクション]列のをクリックします。
メソッド実行分析タブ
メソッド実行分析タブでは、システムによってランダムにキャプチャされた関数実行に関する情報(期間、入力パラメーター、戻り値など)を表示できます。関数内で実行される内部関数にドリルダウンすることもできます。関数実行の分析は、オフライン環境で関数実行を再現するのが難しい場合やログがない場合に適用できます。
- Arthas診断ページで、[メソッド実行分析]タブをクリックします。
- [メソッド実行分析]タブで、サービスを選択し、[OK]をクリックします。重要 サービスを選択すると、EDASはサービスコードに対応するクラスと関数を識別しようとします。試行に失敗した場合は、対応するクラスと関数を指定する必要があります。関数の詳細タブには、名前、期間、入力パラメーター、戻り値、エラー、内部関数など、関数のランダムな実行に関する情報が表示されます。実行に最も時間がかかる内部関数は、[タイムライン(ミリ秒)]列で赤く強調表示されます。
- オプション:内部関数にドリルダウンするには、内部関数を見つけてドリルイン[アクション]列のをクリックします。内部関数の詳細タブには、キャプチャされた内部関数の実行に関する情報(名前、期間、入力パラメーター、戻り値、エラー、より深いレベルの内部関数など)が表示されます。実行に最も時間がかかる、より深いレベルの内部関数は、[タイムライン(ミリ秒)]列で赤く強調表示されます。
- 特定の関数実行をキャプチャするためのフィルター条件を設定するには、次の手順を実行します。
- 選択した関数の詳細タブで、右上隅にある[診断パラメーターの変更]をクリックします。
- [診断パラメーターの設定]ダイアログボックスで、必要に応じてパラメーターを設定し、[OK]をクリックします。
パラメーター 説明 例 例外がスローされた場合のみ エラーを返す関数の実行のみをキャプチャするかどうかを指定します。有効な値: - True:エラーを返す関数の実行のみをキャプチャします。
- False:エラーを返すかどうかに関係なく、関数の実行をキャプチャします。
False 時間消費が次より大きい 実行時間。関数の実行は、その期間が指定された値を超えた場合にのみキャプチャできます。単位:ミリ秒。 30 オブジェクトのデシリアライズレベル パラメーターと戻り値が複雑なオブジェクトである関数実行のデシリアライズレベル。値が大きいほどデシリアライズレベルが深く、複雑なオブジェクトのより多くの内部フィールドを表示できることを意味します。 5 パラメーターを追加 関数実行のパラメーターに制限を設定するためのフィルター条件。例: - サンプル関数:
createOrder関数には、次のコードスニペットが含まれています:class User { private int userId; private String userName; private boolean isVIP; } public void createOrder(User user, String productId, double price) - サンプルフィルター条件:
userIdパラメーターが 8753 に設定されている関数の実行をキャプチャします。 - サンプルパラメーター構成:params[0].userId ; = ; 8753。
params[0].userId ; = ; 8753
アイコンをクリックします。選択した関数の詳細タブに、フィルター条件を満たす関数の実行に関する情報が表示されます。
- オプション:関数のソースコードを表示するには、詳細タブの右上隅にある[メソッドソースコードの表示]をクリックします。