banner
lMingyul

lMingyul

记录穿过自己的万物
jike
twitter
github
bilibili

用好系列-arthasの入門編

会社で故障問題を特定する際、一般的にはコードの重要な部分にログを出力し、環境コンテナ内で Jar パッケージを交換する形式で問題の特定分析を行います。しかし、この方法での問題特定プロセスは非常に面倒です:

  • まず、ログの出力が十分であることを確認する必要があります。もし重要な情報が出力されていなければ、再度出力し、パッケージを交換し、サービスを再起動する必要があり、一連のプロセスで多くの時間を浪費します;
  • 次に、すべての環境でパッケージの交換やサービスの再起動が実行できるわけではありません。

そのため、最近はより良い故障問題の特定方法を探しており、阿里が開発したオープンソースの Java サービス診断ツールがなかなか良さそうだと気付きました。このツールは、メソッド呼び出しの引数、戻り値、呼び出された呼び出しパス、呼び出しにかかる時間、メソッド呼び出しの回数、成功回数、失敗回数などを記録できるため、このツールについて学び、記録しておきます。

arthas とは#

公式紹介:
Arthas は、オンライン監視診断製品で、グローバルな視点からアプリケーションのロード、メモリ、GC、スレッドの状態情報をリアルタイムで確認し、アプリケーションコードを変更することなく、ビジネス問題を診断できます。これには、メソッド呼び出しの引数、例外の確認、メソッド実行時間の監視、クラスロード情報などが含まれ、オンライン問題のトラブルシューティング効率が大幅に向上します。

実行環境#

  • JDK 6 以上の環境のみサポート
  • Java で書かれており、クロスプラットフォームをサポート:Linux(主に)、Mac、Windows

特徴#

  • コマンドラインインタラクティブモードを採用
  • Tabキーによる自動補完機能を提供

初歩的な使用#

会社で使用している環境は主にコンテナ内にあるため、以下では Linux 環境でこのツールを使用する方法を主に記録します。

使用パッケージのダウンロード#

会社の環境は内部ネットワークであり、Github に直接アクセスしてインストールパッケージをダウンロードすることができないため、機械のネットワーク問題でダウンロードできないのを防ぐために、手動で Github からダウンロードし、サービスコンテナ内部にコピーして使用します。

Github で完全なインストールパッケージをダウンロードします。ダウンロードアドレス:https://github.com/alibaba/arthas/releases

CleanShot-2023-04-30-00-13-53@2x

コンテナ環境での解凍#

CleanShot-2023-04-30-00-44-29@2x

アンインストール#

問題を特定した後は、戦場をきれいにする必要がありますので、このツールのアンインストール方法も記録しておきます。

以下の 3 つのステップを実行することでツールをアンインストールできます。

実行#

まず、停止しない Java プログラムサービスを起動します。公式のインストールパッケージには、練習用の Jar パッケージmath-game.jarが付属しています(ただし、一般的に私たちのサービスも常に実行されているため、ここでは公式のパッケージを記録として使用します)。

その後、arthas を起動します。

CleanShot-2023-04-30-00-50-48@2x


よく使うコマンド#

help#

dashboard#

ダッシュボード:現在のシステムのリアルタイムデータパネルを表示します。普段ダッシュボードがないときは、一般的に Linux に付属のtopコマンドを使用してシステムの実行情報を確認します。

dashboardを入力し、Enterを押すと、現在のプロセスの情報が表示されます。ctrl+cを押すか、qを入力すると実行を中断できます。
CleanShot-2023-04-30-01-01-50@2x

表示される情報は大きく 3 つのブロックに分かれています:

  • 一番上はスレッドに関連する情報
  • 中間の領域は JVM メモリに関連する情報
  • 一番下は Java の実行環境情報
    具体的な各列の情報については公式文書を参照してください。

thread#

現在のスレッド情報スタックを確認します。

引数がない場合、最初のページのスレッド情報を表示します。#

デフォルトでは CPU の増分時間の降順で並べ替えられ、最初のページのデータのみが表示されます。

CleanShot-2023-05-03-11-59-07@2x

一度に最も忙しい N 個のスレッドを表示し、スタックを印刷します。#

CleanShot-2023-05-03-12-00-56@2x 1

thread --all、すべての一致するスレッドを表示します。#

CleanShot-2023-05-03-16-43-24@2x

thread id、指定したスレッドの実行スタックを表示します。#

thread -b、現在他のスレッドをブロックしているスレッドを見つけます。#

watch#

指定したメソッドの呼び出し状況を観察します。
観察できる内容:
メソッドの戻り値、引数、メソッドがスローした例外、OGNL 式を記述することで対応する変数の確認も可能です。

関数呼び出しの戻り時の引数、this オブジェクト、戻り値を観察します。#

関数呼び出し前と戻り後を同時に観察します。#

現在のオブジェクトの属性を観察します。#

関数実行前後に現在のオブジェクトの属性を確認したい場合は、target キーワードを使用します。target は現在のオブジェクトを示し、target.field_name を使用して現在のオブジェクトの特定の属性にアクセスします。

trace#

メソッド内部の呼び出しパスを追跡し、パス上の各ノードでの時間を出力します。サービス間の呼び出し時間が長すぎる場合に使用します。

  • 出力結果の #24 は、ソースファイルの 24 行目でprimeFactors()関数が呼び出されたことを示します。
  • 出力結果の #25 は、ソースファイルの 25 行目でprint()関数が呼び出されたことを示します。

stack#

現在のメソッドが呼び出された呼び出しパスを出力します。このメソッドが(多くの場所から呼び出されている場合)どこから実行されたかを知りたいときにこのコマンドを使用します(根源を探るのに適しています)。

jad#

指定したロード済みクラスのソースコードを逆コンパイルし、オンラインでビジネスロジックを理解しやすくします。逆コンパイルされたコードは構文ハイライト付きです。

CleanShot-2023-05-11-00-34-53@2x


参考資料#

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。