1. 序章

Alibaba Arthas は、Javaアプリケーションの監視、プロファイリング、およびトラブルシューティングを可能にする診断ツールです。 Arthasを使用する主な利点の1つは、コードを変更したり、監視するJavaサービスを再起動したりする必要がないことです。

このチュートリアルでは、 Arthasのインストールから始めてから、Arthasの主要な機能のいくつかを示す簡単なケーススタディを紹介します。

最後に、ArthasはJavaで記述されているため、クロスプラットフォームであり、Linux、macOS、およびWindowsで問題なく動作します。

2. ダウンロードとはじめに

まず、Arthasライブラリをダウンロードリンクから直接ダウンロードするか、curlを使用してダウンロードすることから始めましょう。

curl -O https://alibaba.github.io/arthas/arthas-boot.jar

それでは、 -h (ヘルプ)オプションを指定してArthasを実行し、が機能していることをテストしましょう

java -jar arthas-boot.jar -h

成功すると、表示されるすべてのコマンドのヘルプガイドが表示されます。

3. ケーススタディ

このチュートリアル全体を通して、再帰を使用したFibonacciシーケンスのかなり非効率的な実装に基づく非常に単純なアプリケーションを使用します。

public class FibonacciGenerator {

    public static void main(String[] args) {
        System.out.println("Press a key to continue");
        System.in.read();
        for (int i = 0; i < 100; i++) {
            long result = fibonacci(i);
            System.out.println(format("fib(%d): %d", i, result));
        }
    }

    public static long fibonacci(int n) {
        if (n == 0 || n == 1) {
            return 1L;
        } else {
            return fibonacci(n - 1) + fibonacci(n - 2);
        }
    }
}

この例の最も興味深い部分は、フィボナッチの数学的定義に従うフィボナッチメソッドです。

main メソッドでは、比較的大きな数の for ループを使用するため、コンピューターはより長い計算でビジー状態になります。 もちろん、これはまさにArthasを実証するために私たちが望んでいることです。

4. Arthasを開始する

それでは、Arthasを試してみましょう! 最初に行う必要があるのは、小さなフィボナッチアプリケーションを実行することです。 そのために、お気に入りのIDEを使用するか、ターミナルで直接実行することができます。 開始するためにキーを押すように求められます。 プロセスをArthasにアタッチした後、任意のキーを押します。

それでは、Arthas実行可能ファイルを実行してみましょう。

java -jar arthas-boot.jar

Arthasは、アタッチするプロセスを選択するためのメニューを表示します。

[INFO] arthas-boot version: 3.1.7
[INFO] Found existing java process, please choose one and hit RETURN.
* [1]: 25500 com.baeldung.arthas.FibonacciGenerator
...

com.baeldung.arthas.FibonacciGeneratorという名前のものを選択しましょう。 リストに番号(この例では「1」)を入力して、Enterキーを押します。

Arthasは、このプロセスに接続して開始します。

INFO] Try to attach process 25500
[INFO] Attach process 25500 success.
...                     

Arthasを開始すると、さまざまなコマンドを発行できるプロンプトが表示されます。

help コマンドを使用して、使用可能なオプションに関する詳細情報を取得できます。 さらに、Arthasの使用を容易にするために、タブキーを使用してコマンドをオートコンプリートすることもできます。

Arthasをプロセスにアタッチした後、キーを押すことができ、プログラムはフィボナッチ数の印刷を開始します。

5. ダッシュボード

Arthasが起動すると、ダッシュボードを使用できるようになります。 この場合、ダッシュボードコマンドを入力して続行します。 これで、いくつかのペインとJavaプロセスに関する多くの情報を含む詳細な画面が表示されます。

これらのいくつかをさらに詳しく見てみましょう。

  1. 上部のセクションは、現在実行中のスレッド専用です
  2. 重要な列の1つは、各スレッドのCPU消費量です。
  3. セクション3は、スレッドあたりのCPU時間を示しています
  4. もう1つの興味深いペインは、メモリ分析用です。 さまざまなメモリ領域が統計とともに一覧表示されます。 右側には、ガベージコレクターに関する情報があります。
  5. 最後に、セクション5には、ホストプラットフォームとJVMに関する情報があります。

qを押すとダッシュボードを終了できます。

Arthasは、終了してもプロセスに関連付けられることを覚えておく必要があります。 したがって、プロセスから適切にリンクを解除するには、を実行する必要があります止まる指図 。 

6. スタックトレースの分析

ダッシュボードでは、mainプロセスがCPUのほぼ100% oを占めることがわかりました。 このプロセスのIDは1で、最初の列に表示されています。

ダッシュボードを終了したので、スレッドコマンドを実行することで、プロセスをより詳細に分析できます。

thread 1

引数として渡される番号はスレッドIDです。 Arthasは、当然のことながら、fibonacciメソッドの呼び出しで雑然としたスタックトレースを出力します。

スタックトレースが長くて読むのが面倒な場合、threadコマンドを使用するとパイプを使用できます。

thread 1 | grep 'main('

これにより、grepコマンドに一致する行のみが出力されます。

[arthas@25500]$ thread 1 | grep 'main('
    at com.baeldung.arthas.FibonacciGenerator.main(FibonacciGenerator.java:10)

7. Javaクラスを逆コンパイルします

私たちがほとんどまたはまったく知らない[X49X]アプリケーションを分析しているシナリオを想像してみてください。突然、スタックに次のタイプの繰り返し呼び出しが散在していることがわかりました。

[arthas@59816]$ thread 1
"main" Id=1 RUNNABLE
  at app//com.baeldung.arthas.FibonacciGenerator.fibonacci(FibonacciGenerator.java:18)
  at app//com.baeldung.arthas.FibonacciGenerator.fibonacci(FibonacciGenerator.java:18)
  ...

Arthasを実行しているので、クラスを逆コンパイルしてその内容を確認できます。これを実現するには、 jad コマンドを使用して、修飾されたクラス名を引数として渡します。

jad com.baeldung.arthas.FibonacciGenerator

ClassLoader:
+-jdk.internal.loader.ClassLoaders$AppClassLoader@799f7e29
  +-jdk.internal.loader.ClassLoaders$PlatformClassLoader@60f1dd34

Location:
/home/amoreno/work/baeldung/tutorials/libraries-3/target/
/*
 * Decompiled with CFR.
 */
package com.baeldung.arthas;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;

public class FibonacciGenerator {
    public static void main(String[] arrstring) throws IOException {

出力は、逆コンパイルされたJavaクラスと、クラスの場所などのいくつかの有用なメタデータです。 これは本当に便利で強力な機能です。

8. 検索クラスと検索方法

search classコマンドは、JVMにロードされているクラスを検索するときに便利です。 scと入力し、ワイルドカードの有無にかかわらず、引数としてパターンを渡すことで使用できます

[arthas@70099]$ sc *Fibonacci*
com.baeldung.arthas.FibonacciGenerator
Affect(row-cnt:1) cost in 5 ms.

クラスの修飾名を取得したら、次の2つの追加フラグを使用して詳細情報を検索できます。

  • -dはクラスの詳細を表示します
  • -f は、クラスのフィールドを表示します

ただし、クラスのフィールドは、詳細と併せて照会する必要があります。

[arthas@70099]$ sc -df com.baeldung.arthas.FibonacciGenerator
  class-info        com.baeldung.arthas.FibonacciGenerator
  ...

同様に、コマンド sm (検索メソッド)を使用して、クラス内のロードされたメソッドを検索できます。 この場合、クラス com.baeldung.arthas.FibonacciGenerator に対して、次のコマンドを実行できます。

[arthas@70099]$ sm com.baeldung.arthas.FibonacciGenerator
com.baeldung.arthas.FibonacciGenerator <init>()V
com.baeldung.arthas.FibonacciGenerator main([Ljava/lang/String;)V
com.baeldung.arthas.FibonacciGenerator fibonacci(I)J
Affect(row-cnt:3) cost in 4 ms.

フラグ-dを使用して、メソッドの詳細を取得することもできます。 最後に、メソッドの名前にオプションの引数を渡して、返されるメソッドの数を絞り込むことができます。

sm -d com.baeldung.arthas.FibonacciGenerator fibonacci
 declaring-class  com.baeldung.arthas.FibonacciGenerator
 method-name      fibonacci
 modifier         public,static
 annotation
 parameters       int
 return           long
 exceptions
 classLoaderHash  799f7e29

9. メソッド呼び出しの監視

Arthasでできるもう1つの優れた点は、メソッドを監視することです。 これは、アプリケーションのパフォーマンスの問題をデバッグするときに非常に便利です。 これには、monitorコマンドを使用できます。

The モニターコマンドにはフラグが必要です -c および2つの引数—修飾されたクラス名とメソッド名。

ケーススタディでは、monitorを呼び出しましょう。

monitor -c 10 com.baeldung.arthas.FibonacciGenerator fibonacci

予想どおり、Arthasはfibonacciメソッドに関するメトリックを10秒ごとに出力します。

Affect(class-cnt:1 , method-cnt:1) cost in 47 ms.
 timestamp            class                                          method     total   success  fail  avg-rt(ms)  fail-rate                                                                       
-----------------------------------------------------------------------------------------------------------------------------                                                                      
 2020-03-07 11:43:26  com.baeldung.arthas.FibonacciGenerator  fibonacci  528957  528957   0     0.07        0.00%
...                                                                           

また、失敗する可能性のある呼び出しのメトリックもあります。これらはデバッグに役立ちます。

10. メソッド引数の監視

メソッドのパラメーターをデバッグする必要がある場合は、watchコマンドを使用できます。 ただし、構文はもう少し複雑です。

watch com.baeldung.arthas.FibonacciGenerator fibonacci '{params[0], returnObj}' 'params[0]>10' -n 10

それぞれの議論を詳しく見てみましょう。

  • 最初の引数はクラス名です
  • 2番目はメソッド名です
  • 3番目の引数は、監視したいものを定義する OGNL式です。この場合、これは最初の(そして唯一の)メソッドパラメーターであり、戻り値です。
  • 4番目の最後のオプションの引数は、監視する呼び出しをフィルタリングするために使用されるブール式です。

この例では、引数が10より大きい場合にのみ引数を監視します。 最後に、結果の数を10に制限するフラグを追加します。

watch com.baeldung.arthas.FibonacciGenerator fibonacci '{params[0], returnObj}' 'params[0]>10' -n 10
Press Q or Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 19 ms.
ts=2020-02-17 21:48:08; [cost=30.165211ms] result=@ArrayList[
    @Integer[11],
    @Long[144],
]
ts=2020-02-17 21:48:08; [cost=50.405506ms] result=@ArrayList[
    @Integer[12],
    @Long[233],
]
...

ここでは、CPU時間と入力/戻り値を使用した呼び出しの例を見ることができます。

11. プロファイラー

アプリケーションのパフォーマンスに関心のある人のための非常に視覚的な機能は、 profilerコマンドを介して利用できます。 プロファイラーは、プロセスが使用しているCPUのパフォーマンスを評価します。

profilerstartを起動してプロファイラーを実行してみましょう。 これは非ブロッキングタスクです。つまり、プロファイラーが機能している間、Arthasを引き続き使用できます。

profiler getSamples を実行することで、いつでもプロファイラーのサンプル数を確認できます。

を使用してプロファイラーを停止しましょうプロファイラー停止。 この時点で、 FlameGraph 画像が保存されます。 この正確なケースでは、fibonacciスレッドがグラフィックを支配しているチャートがあります。

このグラフは、CPU時間が費やされている場所を検出する場合に特に役立ちます。

12. 結論

このチュートリアルでは、Arthasの最も強力で便利な機能のいくつかを探りました。

これまで見てきたように、Arthasには、さまざまな問題の診断に役立つ多くのコマンドがあります。 また、精査中のアプリケーションのコードにアクセスできない場合や、サーバー上で実行されている問題のあるアプリケーションの迅速な診断を行いたい場合にも特に役立ちます。

いつものように、記事の完全なソースコードは、GitHubから入手できます。