Arthas は、稼働中の Java アプリケーションの問題を診断するためのツールです。バイトコード拡張技術を使用しており、Java 仮想マシン (JVM) プロセスを再起動することなく、アプリケーションのステータスを確認できます。
Application Real-Time Monitoring Service (ARMS) は、Arthas のすべての機能と完全に統合されています。ARMS に統合された Arthas 機能は、Arthas をマウントする場合と比較して、次の利点があります。
Arthas 機能は、Java 開発キット (JDK) 環境に依存しません。Arthas をダウンロードしてインストールする必要はありません。ビジネス要件に基づいて、一度に機能を有効または無効にできます。
主な機能はブラウザでアクセスできます。コマンドや式を指定する必要はありません。
Arthas 機能は ARMS のコンテキストに接続されています。trace コマンドを実行して、ARMS のトレース ID を表示できます。
前提条件
アプリケーション監視は、新しい課金モードを有効にしたユーザー向けに、新しい監視詳細ページを提供します。新しい課金モードの詳細については、「プロダクト課金 (新規)」をご参照ください。
新しい課金モードを有効にしておらず、新しい監視詳細ページを表示したい場合は、[アプリケーション] ページで [新バージョンに切り替え] をクリックします。
この機能は Java アプリケーションでのみ利用可能です。
Arthas 診断はトラブルシューティングのためにのみ有効にしてください。日常的な使用中は無効にしてください。
ARMS エージェントのバージョンが 2.7.1.3 以降であること。
アプリケーションがアプリケーション監視に接続されていること。詳細については、「アプリケーション監視の概要」をご参照ください。
アプリケーションが Java で開発されていること。
背景情報
ARMS は、Arthas の以下のリアルタイム診断機能と統合されています。
JVM 概要:JVM プロセスのリアルタイムのメモリ使用量、システム情報、システム変数、環境変数を表示できます。
スレッド分析:JVM プロセス内のスレッドの時間消費と、指定されたスレッドのリアルタイムのメソッドスタックを表示できます。
メソッド実行分析:指定された条件を満たす非 JDK メソッドの実行レコードをキャプチャし、各内部メソッドのパラメーター、例外、戻り値、実行時間を記録します。
オブジェクトビューアー:任意のクラスのインスタンスのリアルタイムのプロパティ値を表示できます。
リアルタイムダッシュボード:一般的なコンポーネントに関するリアルタイム情報を表示できます。たとえば、Druid 接続プールの構成、使用状況、SQL クエリの時間消費などを表示できます。
Arthas Shell:コマンドラインインターフェイス (CLI) を使用して Arthas 診断を実行できます。
Arthas パフォーマンス分析は、継続的プロファイリング機能に完全にアップグレードされました。これは、よりユーザーフレンドリーで強力であり、いつでも日常的に有効にして使用できます。
継続的プロファイリング機能は、Java プログラムにおける CPU、メモリ、または I/O によって引き起こされるボトルネックを効果的に発見し、メソッド名、クラス名、行番号ごとに統計データを表示します。これにより、開発者はプログラムを最適化し、レイテンシーを削減し、スループットを向上させ、コストを節約できます。詳細については、「継続的プロファイリング機能の使用」をご参照ください。
Arthas のバージョン情報
ARMS エージェントのバージョン 2.7.1.3 から 4.6.x の場合、対応する Arthas のバージョンは 3.5.6 です。ARMS エージェントのバージョン 4.7.x 以降の場合、対応する Arthas のバージョンは 4.1.0 です。
Arthas 診断の有効化
ARMS コンソールにログインします。左側のナビゲーションウィンドウで、を選択します。
上部のナビゲーションバーで、を選択します。
[Arthas モニタリング] セクションで、[Arthas] スイッチをオンにします。必要に応じて、特定の IP アドレスに対してのみ診断を実行し、対象の IP アドレスを追加できます。
[保存] をクリックします。
Arthas 診断情報の表示
ARMS コンソールにログインします。左側のナビゲーションウィンドウで、を選択します。
上部のナビゲーションバーで、を選択します。
Arthas 診断ページで、上部のドロップダウンリストから診断を実行したいアプリケーションインスタンスを選択します。
インスタンスにインストールされている ARMS エージェントが V2.7.1.3 より古い場合、エージェントの更新を指示されます。
インスタンスにインストールされている ARMS エージェントが V2.7.1.3 以降の場合、ページには Arthas が提供するインスタンス情報が表示されます。
JVM 概要
[JVM 概要] タブでは、JVM メモリの統計、オペレーティングシステムや変数の情報など、アプリケーションに関する JVM 情報を表示できます。
デフォルトでは、Arthas 診断ページにアクセスすると、[JVM 概要] タブが表示されます。[JVM 概要] タブには、以下のセクションがあります。
JVM メモリ: ヒープメモリと非ヒープメモリの使用量、および GC に関する情報などを表示します。
オペレーティングシステム情報: 平均システム負荷、オペレーティングシステム名とバージョン、および Java バージョンなど、オペレーティングシステムに関する情報を表示します。
変数情報:システム変数と環境変数に関する情報を表示します。
スレッド時間消費分析
[スレッド時間消費分析] タブでは、アプリケーションのすべてのスレッドと各スレッドのスタック情報を表示できます。この情報により、時間のかかるスレッドを簡単に特定できます。
Arthas 診断ページで、[スレッド消費時間分析] タブをクリックします。
[スレッド消費時間分析] タブでは、JVM プロセス内のスレッドの消費時間を表示できます。類似のスレッドは、カテゴリとして 1 行に表示されます。
スレッドカテゴリ名の左側にある [+] アイコンをクリックすると、このカテゴリ配下にあるすべてのスレッドの詳細 (スレッド ID、CPU 使用率、ステータスなど) を表示できます。
スレッドの [アクション] 列の [ライブスタックの表示] をクリックすると、スレッドのスタック情報が表示されます。

メソッド実行分析
[メソッド実行分析] タブでは、メソッドの時間消費、入力パラメーター、戻り値などの情報を表示し、内部メソッドまでドリルダウンすることもできます。この情報を使用して、遅い呼び出しやログ欠落の根本原因を特定したり、再現性のない問題をトラブルシューティングしたりできます。
Arthas 診断ページで、[メソッド実行分析] タブをクリックします。
[メソッド実行分析] タブで、検索ボックスにクラス名のキーワードを入力し、
アイコンをクリックします。 表示されたクラスの中から診断を実行するクラスを探し、右側のドロップダウンリストでそのクラスのメソッドを選択して、[OK] をクリックします。
ARMS は、メソッドのランダムな実行レコードをキャプチャします。実行情報が表示されます。

選択したメソッドの内部実行レコードは、左側の[実行スタック]セクションに表示されます。
内部メソッドにドリルダウンするには、内部メソッドを見つけ、[アクション] 列の [ドリルイン] をクリックします。
メソッドのソースコードを表示するには、[実行スタック] の横にある [ソースコードの表示] をクリックします。
各内部メソッドの実行時間は、ソースコードの注釈に表示されます。
右側の[メソッド実行結果]セクションには、メソッドのパラメーター値、戻り値、例外、メンバー変数、およびトレース ID が表示されます。
右側の [実行条件の設定] セクションで、メソッド実行レコードの取得条件を設定するには、次の手順を実行します。
ドロップダウンリストから再読み込みメソッドを選択します。
[初期フィルターキーの選択] ドロップダウンリストで、最初に指定するキータイプを選択し、
アイコンをクリックします。キータイプ:
params[n]:メソッドの n 番目のパラメーター。
returnObj:メソッドの戻り値。
メソッド実行時間:メソッドの実行時間。
例外がスローされたかどうか:メソッド実行中に例外がスローされたかどうかを指定します。
説明ネストされたキーが選択された場合、基本フィールドが選択されるまで、ネストされたキーのフィールドを指定し続ける必要があります。
条件を選択します。
値を入力します。
[追加] をクリックします。
メソッド実行レコードを選択するための条件は、[現在のフィルター条件] セクションに表示されます。

[実行スタック] セクションの右上隅で、
アイコンをクリックします。すると、システムは指定された条件に基づいてメソッドの実行レコードを取得します。
オブジェクトビューアー
[objectViewer] タブでは、一部のシングルトンオブジェクトの情報を表示して、構成エラー、ブラックリストやホワイトリストの不適切な項目、メンバー変数の異常なステータスなどのアプリケーション例外をトラブルシューティングできます。
Arthas 診断ページで、[objectViewer] タブをクリックします。
[objectViewer] タブで、検索ボックスにクラス名のキーワードを入力し、[検索] アイコンをクリックします。
表示されたクラスから診断を実行するクラスを選択し、右側のペインでクラスのインスタンスを選択して、[OK] をクリックします。
インスタンスのリアルタイムのフィールド値が表示されます。

シンプルなフィールドの値は、左側の [オブジェクトのフィールドのリアルタイム値] セクションの [詳細] 列に表示されます。
複合フィールドの値を表示するには、左側の [オブジェクトのリアルタイムフィールド値] セクションの [詳細] 列にある [詳細の表示] をクリックします。 フィールドの詳細値は、右側の [フィールド詳細] セクションに表示されます。
複雑なフィールド値の一部のみが逆シリアル化され、[フィールド詳細] セクションに表示されます。 より多くのデータを表示するには、「詳細」の横にある括弧内の [クリック] ハイパーリンクをクリックします。
リアルタイムダッシュボード
[リアルタイムボード] タブでは、データベース接続プールの使用状況や HTTP 接続プールの使用状況など、使用中の主要コンポーネントに関するリアルタイム情報を表示できます。この情報は、リソースの問題を特定するのに役立ちます。
Arthas 診断ページで、[リアルタイムボード] タブをクリックします。
[リアルタイムボード] タブで、ドロップダウンリストからダッシュボードを選択し、ダッシュボードのインスタンスを選択して、[ボードに追加] をクリックします。
コンポーネントに関するリアルタイム情報が表示されます。次の図は、Druid 接続プールのリアルタイム情報を示しており、基本構成、接続プールのステータス、実行時間などが含まれています。

Arthas Shell
この機能は、中国 (北京)、中国 (上海)、中国 (杭州)、中国 (深セン)、中国 (張家口) のリージョンでのみ利用可能です。
CLI を使用してArthas 診断を実行できます。

よくある質問
Arthas を有効にした後、プロンプトが表示されず、ハートビートもないのはなぜですか?
この問題は、次の理由で発生する可能性があります:
ネットワーク接続の失敗。
ネットワーク接続を確認します。パブリックアプリケーション診断ポート (9092) と内部アプリケーション診断ポート (9092) の両方への接続が失敗する場合、セキュリティグループでアプリケーション診断ドメイン名のポート 9092 に対するアウトバウンドアクセス権限を付与する必要があります。また、対応するリージョンのエンドポイントドメイン名に対する権限も付与する必要があります。アクセスが必要なドメイン名のリストについては、「Java アプリケーション監視のネットワーク構成」をご参照ください。アプリケーション診断ドメイン名は、呼び出しトレースメタデータドメイン名と同じです。
SkyWalking エージェントがアプリケーションにマウントされている。
ARMS に統合された Arthas は SkyWalking と互換性がありません。これらは共存できません。SkyWalking エージェントをアンインストールするか、手動で Arthas 3.7.0 以降のバージョンをマウントする必要があります。
cat ~/logs/arthas/arthas.logコマンドを実行します。ログの最後に、エージェントの非互換性を示す例外メッセージが見つかります。2023-09-11 09:09:47 [arthas-binding-thread] ERROR c.t.a.core.server.ArthasBootstrap -start channel client failure java.lang.ExceptionInInitializerError: null at com.alibaba.arthas.channel.proto.ArthasServiceGrpc$ArthasServiceStub.register(ArthasServiceGrpc.java:306) at com.alibaba.arthas.channel.client.ChannelClient.connect(ChannelClient.java:165) at com.alibaba.arthas.channel.client.ChannelClient.start(ChannelClient.java:111) at com.taobao.arthas.core.server.ArthasBootstrap.bind(ArthasBootstrap.java:478) at com.taobao.arthas.core.server.ArthasBootstrap.<init>(ArthasBootstrap.java:162) at com.taobao.arthas.core.server.ArthasBootstrap.getInstance(ArthasBootstrap.java:613) at com.taobao.arthas.core.server.ArthasBootstrap.getInstance(ArthasBootstrap.java:601) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.taobao.arthas.agent334.AgentBootstrap.bind(AgentBootstrap.java:182) at com.taobao.arthas.agent334.AgentBootstrap.access$000(AgentBootstrap.java:20) at com.taobao.arthas.agent334.AgentBootstrap$1.run(AgentBootstrap.java:152) Caused by: java.lang.reflect.InvocationTargetException: null at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at io.grpc.stub.ClientCalls.<clinit>(ClientCalls.java:52) ... 14 common frames omitted Caused by: java.lang.reflect.InvocationTargetException: null at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.skywalking.apm.dependencies.net.bytebuddy.dynamic.Nexus.initialize(Nexus.java:139) ... 19 common frames omitted Caused by: java.lang.NoClassDefFoundError: Lorg/apache/skywalking/apm/agent/core/plugin/interceptor/enhance/StaticMethodsInter; at java.lang.Class.getDeclaredFields0(Native Method) at java.lang.Class.privateGetDeclaredFields(Class.java:2583) at java.lang.Class.getDeclaredField(Class.java:2068) at org.apache.skywalking.apm.dependencies.net.bytebuddy.implementation.LoadedTypeInitializer$ForStaticField.onLoad(LoadedTypeInitializer.java:163) at org.apache.skywalking.apm.dependencies.net.bytebuddy.implementation.LoadedTypeInitializer$Compound.onLoad(LoadedTypeInitializer.java:233) at org.apache.skywalking.apm.dependencies.net.bytebuddy.agent.builder.AgentBuilder$InitializationStrategy$SelfInjection$Dispatcher$InjectingInitializer.onLoad(AgentBuilder.java:3655) ... 24 common frames omitted Caused by: java.lang.ClassNotFoundException: org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.StaticMethodsInter at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at com.taobao.arthas.agent.ArthasClassloader.loadClass(ArthasClassloader.java:34) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 30 common frames omitted
[メソッド実行分析] タブで、しばらく読み込みアイコンが表示された後、コマンド実行失敗が報告されるのはなぜですか?

メソッド実行分析は、現在選択されているメソッドの実行をリアルタイムでキャプチャします。待機期間中に指定されたメソッドが実行されない場合、このエラーが発生します。右側の [更新] アイコンをクリックして再試行できます。
Arthas が表示する survivor_space のサイズが実際の値の半分なのはなぜですか?
survivor_space は、from と to の 2 つの等しい部分に分かれています。Arthas は from 領域のサイズのみを表示します。
Arthas 診断に追加料金はかかりますか?
いいえ、追加料金はかかりません。
ARMS コンソールで Arthas を有効にした後、手動で Arthas をマウントすると "connection refused" というメッセージが表示されるのはなぜですか?
デフォルトでは、Arthas はポート 3658 を使用して新しいクライアント接続を受け入れます。ARMS に統合された Arthas は、同じマシン上の複数のプロセスが同時に Arthas をマウントする際のポート競合を避けるためにランダムなポートを使用します。これにより、マウントが失敗する可能性があります。この場合、ARMS コンソールで Arthas 機能を無効にする必要があります。
ARMS コンソールで Arthas を有効にした後、ログに "Arthas server already bind." というメッセージが表示されるのはなぜですか?
以前にオープンソース版の Arthas がアプリケーションにマウントされていた場合、ARMS に統合された Arthas を有効にすることはできません。まずオープンソースの Arthas を削除してから、ARMS に統合された Arthas を有効にする必要があります。