Arthas は、Java アプリケーションの本番環境の問題を診断するための強力なツールです。バイトコードインストルメンテーションを使用して、JVM プロセスを再起動することなく、プログラムの実行時の状態を検査できます。
前提条件
-
Application Monitoring (ARMS) は、新しい料金プランを有効化したユーザー向けに、新しいモニタリング詳細ページを提供します。詳細については、「製品の請求 (新規)」をご参照ください。
新しい料金プランを有効化しておらず、新しいモニタリング詳細ページを表示したい場合は、[Application List] ページで [Switch to New Version] をクリックします。
-
現在、この機能は Java アプリケーションのみをサポートしています。
-
Arthas 診断機能は、トラブルシューティング時にのみ有効化し、通常時は無効にすることを推奨します。
-
ARMS エージェントのバージョンが v2.7.1.3 以降であること。
-
お使いのアプリケーションが ARMS に接続されていること。詳細については、「Application Monitoring の概要」をご参照ください。
-
アプリケーションが Java で記述されていること。
背景情報
ARMS が提供する Arthas 診断機能は、ARMS のリアルタイム診断機能を補完することを主な目的としています。ARMS の Arthas 診断機能には、次の種類があります。
-
JVM 概要:現在の JVM プロセスのリアルタイムのメモリ使用量、システム情報、システム変数、環境変数を表示します。
-
スレッド実行時間分析:現在の JVM プロセス内のスレッドが消費する CPU 時間と、特定のスレッドのリアルタイムのメソッドスタックを表示します。
-
メソッド実行分析:指定された条件を満たす JDK 以外のメソッドの単一の実行レコードをキャプチャします。このレコードには、メソッドのパラメーター、例外、戻り値、および内部メソッドの実行時間が含まれます。
-
オブジェクトビューアー:任意のクラスインスタンスのフィールド値をリアルタイムで表示します。
-
リアルタイムダッシュボード:一般的なコンポーネントのリアルタイムダッシュボードを表示します。たとえば、Druid 接続プールのリアルタイムダッシュボードには、その設定、使用状況、SQL 実行時間が表示されます。
-
パフォーマンス分析:一定期間にわたって CPU 時間やメモリ割り当てなどのデータをサンプリングし、対応するフレームグラフを生成します。
-
Arthas Shell:コマンドラインを使用して Arthas 診断を実行します。
Arthas のバージョン情報
ARMS エージェントのバージョンが v2.7.1.3 から 4.6.x の場合、対応する Arthas のバージョンは 3.5.6 です。ARMS エージェントのバージョンが 4.7.x 以降の場合、対応する Arthas のバージョンは 4.1.0 です。
Arthas 診断の有効化
-
ARMS コンソールにログインします。左側メニューで、 を選択します。
-
アプリケーションリスト ページで、ページ上部でリージョンを選択し、対象アプリケーションの名前をクリックします。
説明言語 列のアイコンは、次のことを示します:
:ARMS に接続されている Java アプリケーション。
:ARMS に接続されている Go アプリケーション。
:ARMS に接続されている Python アプリケーション。[-] :Managed Service for OpenTelemetry に接続されているアプリケーション。
-
上部メニューで、 を選択します。
-
Arthas の監視 セクションで、[Arthas] スイッチをオンにします。設定に特定の IP アドレスを追加することで、その IP アドレスに対してのみ診断を実行することもできます。
-
保存 をクリックします。
Arthas 診断の表示
-
ARMS コンソールにログインします。左側メニューで、 を選択します。
-
アプリケーションリスト ページで、ページ上部でリージョンを選択し、対象アプリケーションの名前をクリックします。
説明言語 列のアイコンは、次のことを示します:
:ARMS に接続されている Java アプリケーション。
:ARMS に接続されている Go アプリケーション。
:ARMS に接続されている Python アプリケーション。[-] :Managed Service for OpenTelemetry に接続されているアプリケーション。
-
上部メニューで、 を選択します。
-
[Arthas Diagnostics] ページの上部で、ドロップダウンリストから診断するインスタンスを選択します。
-
インスタンスの ARMS エージェントが v2.7.1.3 以降にアップグレードされていない場合、ページにはまずエージェントをアップグレードするよう促すプロンプトが表示されます。
-
インスタンスの ARMS エージェントが v2.7.1.3 以降にアップグレードされている場合、ページにはそのインスタンスの Arthas 診断情報が表示されます。
-
JVM 概要
JVM 概要機能では、メモリ、オペレーティングシステム情報、変数など、アプリケーションの JVM ステータスの概要を確認できます。
Arthas 診断ページでは、デフォルトで JVM 概要 タブが表示されます。JVM 概要 タブでは、次の情報を確認できます:
-
JVM メモリ:JVM メモリに関する情報で、ヒープ使用量、非ヒープ使用量、GC ステータスなどが含まれています。テーブルには、[heap]、[buffer_pool]、[nonheap] 領域の [Used]、[Total]、[Max] メモリ、および各 GC タイプの [Total Count] と [Total Time] が表示されます。
-
[オペレーティングシステム情報]:平均負荷、OS 名、OS バージョン、Java バージョンなど、オペレーティングシステムに関する情報です。フィールドには systemLoadAverage、osVersion、javaVersion、processors、osName、javaHome、timestamp、および uptime が含まれます。
-
変数情報:変数に関する情報で、システム変数と環境変数が含まれています。ページは左側の [System variables] パネルと右側の [Environment variables] パネルに分かれており、それぞれにキーワードでフィルタリングするための検索ボックスがあります。変数はキーと値のペアとして表示されます。
スレッド実行時間分析
スレッド実行時間分析では、アプリケーションのすべてのスレッドが表示され、スレッドのスタック情報を確認できます。これにより、CPU 使用率の高いスレッドをすばやく特定できます。
-
[Arthas Diagnostics] ページで、スレッド時間分析 タブをクリックします。
スレッド時間分析 タブは、現在の JVM プロセス内のスレッドのリアルタイム CPU 使用率を取得して、類似のスレッドをグループ化します。ページの上部には、各状態 ([NEW]、[TERMINATED]、[RUNNABLE]、[BLOCKED]、[WAITING]、[TIMED_WAITING]) のスレッド数が表示されます。下のテーブルは、スレッドを [Name]、[Total CPU]、[Count] で集計します。グループを展開すると、各スレッドの ID、CPU 使用率、状態、および [View Live Stack] アクションを表示できます。
-
スレッドグループの左側にある [+] アイコンをクリックして、その詳細を展開します。各スレッドの ID、CPU 使用率、状態を表示できます。
-
スレッドのスタックを表示するには、そのスレッドの 操作 列にある リアルタイムスタックの表示 をクリックします。
[Thread Details] ダイアログボックスが表示され、スレッド名、状態 (例:RUNNABLE)、および完全な Java スタックが表示されます。
メソッド実行分析
メソッド実行分析を使用すると、特定のメソッド実行の時間、入力パラメーター、戻り値をキャプチャしてドリルダウンできます。これにより、遅い呼び出しの根本原因をすばやく特定でき、オフラインで問題を再現できない場合やログがない場合に役立ちます。
-
[Arthas Diagnostics] ページで、メソッド実行分析 タブをクリックします。
-
メソッド実行分析 タブで、検索ボックスにクラス名のキーワードを入力し、
アイコンをクリックします。 -
検索結果から診断したいクラスを選択し、右側のドロップダウンリストからメソッドを選択して、確定する をクリックします。
このページには、選択されたメソッドについて、ARMS と によってランダムにキャプチャされた実行の情報が表示されます。
-
左側の [Execution Stack] セクションには、診断されたメソッドの内部実行レコードが表示されます。
-
内部メソッドにドリルダウンするには、操作 列の ドリルダウン をクリックします。
-
メソッドのソースコードを表示するには、[Execution Stack] セクションの上部にある [View Source Code] をクリックします。
各内部メソッドの実行時間は、ソースコード内にコメントとして表示されます。
-
-
右側の [Method Execution Result] セクションには、パラメーター値、戻り値、例外、メンバー変数、およびこのメソッド実行の TraceID が表示されます。
-
右側の [Set Execution Conditions] セクションで、次の手順に従ってメソッド実行レコードをキャプチャするための条件を設定します:
-
現在のメソッドのオーバーロードされたメソッドを選択します。
-
[Please select initial filter key] ドロップダウンリストからキーの種類を選択し、
アイコンをクリックします。初期フィルターキーの種類:
-
params[n]:メソッドの n 番目のパラメーター。 -
returnObj:メソッドの戻り値。 -
[Method execution duration]:メソッドの実行時間。
-
[Whether an exception is thrown]:メソッドが例外をスローしたかどうかに基づく条件。
説明選択した初期フィルターキーがネストされた型である場合は、プリミティブ型に到達するまでその内部フィールドを選択し続ける必要があります。
-
-
比較演算子を選択します。
-
フィルター値を入力します。
-
追加 をクリックします。
追加されたフィルター条件は 現在のフィルター条件 セクションに表示されます。
たとえば、オーバーロードされたメソッド doGetDatas(ArmsCtx, String) を選択し、現在のフィルターキーを params[0].userId に設定し、演算子 [=] を選択し、値 123 を入力して、[追加] をクリックします。[現在のフィルタリング条件] セクションには、params.length = 2 や params[0].userId = 123 など、設定された条件が表示されます。
-
[Execution Stack] セクションの右上隅にある
アイコンをクリックします。システムは、設定された条件に基づいてメソッドの実行を再キャプチャします。
-
-
オブジェクトビューアー
オブジェクトビューアーを使用して、シングルトンオブジェクトの状態を検査し、アプリケーションの設定、許可リスト、拒否リスト、およびメンバー変数に関する問題をトラブルシューティングします。
-
[Arthas Diagnostics] ページで、オブジェクトビューアー タブをクリックします。
-
オブジェクトビューアー タブで、検索ボックスにクラス名のキーワードを入力し、検索 アイコンをクリックします。
-
検索結果から診断するクラスを選択します。次に、右側のインスタンスリストからインスタンスを選択し、確定する をクリックします。
ページには、そのインスタンスのフィールドのリアルタイム値が表示されます。ページは、左側の [Real-time Field Values of Object] パネル (Type、Field Name、Details 列を持つテーブル) と、右側の [Field Details] パネル (選択されたフィールドの詳細な JSON データを表示) に分かれています。
-
単純型のフィールドの場合、オブジェクトフィールドリアルタイム値取得 パネルの 詳細 列にフィールドの値が表示されます。
-
複合型のフィールドの場合、オブジェクトフィールドリアルタイム値取得 パネルの 詳細 列にある クリックして詳細を表示する をクリックすると、右側の フィールド詳細 パネルにフィールドの値の詳細が表示されます。
フィールド詳細 パネルは、複合フィールドの 1 レベルのデシリアライズのみをサポートします。より具体的なデータを表示するには、クリック をクリックします。
-
リアルタイムダッシュボード
リアルタイムダッシュボードを使用して、データベース接続プールや HTTP 接続プールなど、システム内の主要コンポーネントのリアルタイムステータスを確認できます。これは、リソース関連の問題をトラブルシューティングするのに役立ちます。
-
[Arthas Diagnostics] ページで、リアルタイムダッシュボード タブをクリックします。
-
リアルタイムダッシュボード タブで、ドロップダウンリストからダッシュボードを選択し、右側のインスタンス選択ボックスからインスタンスを選択して、ダッシュボードに追加 をクリックします。
ページには、ダッシュボードのリアルタイムデータが表示されます。たとえば、Druid 接続プールの場合、ステータス情報には、基本設定、プールステータス、実行時間分布が含まれます。基本設定には [DbType] と [URL] が含まれます。プールステータスには、[ActiveCount]、[PoolingCount]、[MaxActive] などのメトリクスが含まれます。下の棒グラフは、[connection holding time distribution] と [transaction execution duration distribution] を示しています。
パフォーマンス分析
パフォーマンス分析では、一定期間の CPU 時間やメモリ割り当てなどのデータをサンプリングしてフレームグラフを生成します。これにより、アプリケーションのパフォーマンスのボトルネックをすばやく特定できます。
-
[Arthas Diagnostics] ページで、パフォーマンス分析 タブをクリックします。
-
パフォーマンス分析 タブの下にある Create flame map をクリックします。
-
Create flame map ダイアログボックスで、フレームグラフの種類を選択し、サンプリング期間と備考を入力して、確認 をクリックします。
パラメーター
説明
例
フレームグラフの種類
サンプリングするオブジェクトの種類。有効値:
-
[CPU time]
-
[Memory allocation]
-
[Lock time]
-
[itimer]
CPU time
サンプリング期間 (秒)
サンプリング期間。有効な値:10~1800。
30
作成されたフレームグラフのタスク情報は、パフォーマンス分析 タブの下に表示されます。これには、開始時間、サンプリング期間、備考、フレームグラフの種類、タスクステータスが含まれます。タスクが完了すると、[Task Status] 列に [View flame graph] リンクが表示されます。このリンクをクリックすると、生成されたフレームグラフを表示できます。
-
-
パフォーマンス分析 タブの下で、タスクレコードを探します。タスクのステータス 列で View flame chart をクリックします。画面の指示に従ってフレームグラフファイルを SVG 形式でダウンロードし、ブラウザーでファイルを開きます。

Arthas Shell
コマンドラインを使用して、カスタムの Arthas 診断を実行できます。
Arthas シェルページの上部で、[ルート] を選択し、[接続] または [切断] ボタンを使用できます。 接続に成功すると、緑色の [接続済み] ステータスプロンプトが表示されます。 下部にある黒いターミナルインターフェイスには、[arthas@9]$ のような Arthas コマンドプロンプトが表示されます。 ターミナルで Arthas コマンドを入力して、診断操作を実行できます。
よくある質問
Arthas を有効にした後にプロンプトやハートビートが表示されない
この問題は、次の 2 つの理由で発生する可能性があります:
-
ネットワーク接続の問題。
ネットワーク接続を確認します。パブリックとプライベートの両方のアプリケーション診断ポート (9092) への接続が失敗した場合、対応するリージョンの診断およびアクセスエンドポイントドメインに対して、ポート 9092 でのアウトバウンドアクセスを許可するようにセキュリティグループを設定する必要があります。必要なドメイン名については、「Java Application Monitoring のネットワーク設定」をご参照ください。アプリケーション診断ドメインは、トレースメタデータドメインと同じです。
-
アプリケーションに 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
メソッド実行分析でのコマンド失敗
[メソッド実行分析] ページの [実行スタック] セクションのローディングアニメーションは、システムがメソッドの呼び出しを待機していることを示します。
メソッド実行分析は、現在選択されているメソッドの実行をリアルタイムでキャプチャします。待機期間中にメソッドが実行されない場合、操作はタイムアウトし、このエラーが発生します。[Refresh] アイコンをクリックして再試行できます。
Survivor 領域のサイズが正しくない
Survivor 領域は、「from」領域と「to」領域の 2 つの等しい部分に分割されます。Arthas は、「from」領域のサイズのみを表示します。
Arthas 診断の課金
この機能に追加料金はかかりません。
Arthas を手動でアタッチする際の接続拒否
デフォルトでは、Arthas はポート 3658 を使用して新しいクライアント接続を受け入れます。同じホスト上の複数のプロセスが Arthas をアタッチする際のポート競合を防ぐため、ARMS に統合された Arthas はランダムなポートを使用します。これにより、アタッチが失敗することがあります。この問題が発生した場合は、Arthas を手動でアタッチする前に、ARMS コンソールで Arthas 機能を無効にする必要があります。
"Arthas server already bind" エラー
以前にオープンソースの Arthas インスタンスがアプリケーションにアタッチされていた場合、ARMS に統合された Arthas は有効化できません。まずオープンソースの Arthas を削除してから、ARMS に統合された Arthas を有効にする必要があります。