1はじめに
Arthasとは何ですか?
Githubの公式紹介からの抜粋
Alibaba Arthasは、Javaアプリケーションの監視、分析、診断を可能にする診断ツールです。Arthasを使用する主な利点の1つは、コードを変更したり、監視対象のJavaサービスを再起動したりする必要がないことです。
この記事では、まずArthasをインストールし、次にケーススタディを実行してArthasの主要な機能をいくつか紹介します。
最後に、ArthasはJavaで記述されているため、クロスプラットフォームであり、Linux、macOS、およびWindowsで正常に実行できます。
2.ダウンロードして使い始める
まず、ダウンロードリンクから直接、またはcurlを使用してArthasライブラリのダウンロードを開始しましょう。
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
次に、-h(ヘルプ)オプションを指定してArthasを実行し、正しく機能するかどうかをテストします。
java -jar arthas-boot.jar -h
成功すると、すべての表示コマンドのヘルプガイドが表示されます。
3.ケーススタディ
チュートリアル全体を通して、再帰を使用したフィボナッチ数列のかなり非効率的な実装に基づく非常に単純なアプリケーションを使用します。
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);
} }}
この例の最も興味深い部分は、フィボナッチがフィボナッチ数の数学的定義に従うことです。
メインの方法では、より大きな数のforループを使用するため、コンピューターはより長い計算でビジーになります。
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の使用を容易にするために、Tabキーを使用してコマンドを自動的に完了することもできます。
Arthasをプロセスにアタッチした後、キーを押すとプログラムがフィボナッチ数の印刷を開始します。
5.ダッシュボード
Arthasが起動したら、ダッシュボードを使用できます。この場合は、続けてダッシュボードコマンドを入力します。これで、いくつかのペインとJavaプロセスに関する多くの情報を含む詳細画面が表示されます。
それらのいくつかについてさらに詳しく学ぶ:
- トップは現在実行中のスレッド専用です
- 重要な列の1つは、各スレッドのCPU消費です
- セクション3は、各スレッドのCPU時間を示しています。
- 別の興味深いペインは、メモリー分析用です。さまざまなメモリ領域とその統計が一覧表示されます。右側には、ガベージコレクターに関する情報があります。
- 最後に、セクション5では、ホストプラットフォームとJVMに関する情報を提供します。
qを押すとダッシュボードを終了できます。
私たちが辞めたとしても、Arthasは依然としてこのプロセスに執着していることを覚えておいてください。したがって、プロセスから適切に切断するために、停止コマンドを実行する必要があります。
6.スタックトレースを分析する
ダッシュボードでは、メインプロセスがCPUのほぼ100%を占めていることがわかります。このプロセスのIDは1で、最初の列に表示されます。
ダッシュボードを終了したので、threadコマンドを実行して、プロセスをさらに詳しく分析できます。
thread 1
パラメータとして渡される番号はスレッドIDです。当然のことながら、Arthasはスタックトレースを出力しますが、これはフィボナッチメソッドの呼び出しを混乱させます。
スタックトレースが長くて扱いにくい場合は、スレッドコマンドを使用してパイプを使用できます。
thread 1 | grep 'main('
これは、grepコマンドと一致する行のみを出力します。
[arthas@25500]$ thread 1 | grep 'main('
at com.baeldung.arthas.FibonacciGenerator.main(FibonacciGenerator.java:10)
7. Javaクラスを逆コンパイルする
ほとんどまたはまったく知らないJavaアプリケーションを分析していて、突然、スタックが次のタイプの繰り返し呼び出しでいっぱいであることがわかったシナリオを想像してください。
[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.FibonacciGeneratorAffect(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;)Vcom.baeldung.arthas.FibonacciGenerator fibonacci(I)JAffect(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コマンドを使用できます。
monitorコマンドには、フラグ-c <sec>と2つのパラメーター(修飾されたクラス名とメソッド名)が必要です。
私たちのケーススタディでは、モニターを呼び出しましょう:
monitor -c 10 com.baeldung.arthas.FibonacciGenerator fibonacci
予想どおり、Arthasは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.プローブ
プロファイラコマンドは、アプリケーションのパフォーマンスに関心があるユーザーに非常に直感的な機能を提供できます。プロファイラーは、プロセスが使用しているCPUのパフォーマンスを評価します。
プロファイラの起動を開始して、プロファイラを実行してみましょう。これは非ブロッキングタスクです。つまり、プロファイラーが動作している間もArthasを使い続けることができます。
いつでも、プロファイラーgetSamplesを実行することで、プロファイラーのサンプル数を確認できます。
次に、プロファイラー停止を使用してプロファイラーを停止します。この時点で、FlameGraph画像が保存されます。この場合、フィボナッチラインが優勢なチャートが表示されます。
このグラフは、CPU時間が費やされている場所を検出する場合に特に役立ちます。
12.まとめ
この記事では、Arthasの最も強力で便利な機能のいくつかを探りました。
これまで見てきたように、Arthasにはさまざまな問題の診断に役立つ多くのコマンドがあります。また、アプリケーションにアクセスするコードを再確認できない場合や、サーバーで実行されている問題のあるアプリケーションをすばやく診断する場合にも特に役立ちます。
ソースコードはGithubで入手できます。