|
Arthasは、強力なオープンソースのJava診断プログラムです。簡単に起動でき、グラフィカルインターフェースでJavaプログラムを操作できます。プログラムのメモリ使用量、スレッド情報、GCステータスの監視をサポートし、既存のコードを逆コンパイルして変更することも可能です。 I. Arthasの動作原理を簡単に説明する(理解)Arthas の基本的な動作原理は次のとおりです。
II. Arthasの基本的な使用方法の詳細な説明1.ダウンロードしてインストールするいくつかの典型的な事例を紹介する前に、Arthasをダウンロードしてインストールする必要があります。Arthasの公式サイトは以下の通りです。 Arthasの公式サイト:https://arthas.aliyun.com/ 便宜上、私は通常、ダウンロードにコマンドラインを使用します。 完了したら、次のコマンドを使用して Arthas を起動できます。 この時点で、対応するプロセスIDとプロセスPIDを確認できます。例えば、Arthasを起動すると、シリアル番号1(9121)のJavaプロセスが表示されます。1を直接クリックしてEnterキーを押すと、このプロセスを監視および管理できます。 Arthas は最初の試行で必要な依存関係をダウンロードします。その後、Arthas を正式に使用して現在のプロセスを管理できるようになります。 2. オフラインユーザー向けアプリの使い方(オプション)イントラネット上のユーザーはインターネットに接続できず、Arthasを初期化できないため、Arthasではフルパッケージをダウンロードできる便利なオプションも提供しています。必要な方はダウンロードページにアクセスし、フルパッケージのダウンロードを選択して、Arthasの完全なパッケージを入手できます。 ダウンロードして解凍したら、次のスクリプト コマンドを使用して Arthas をすぐに起動できます。 3. 一般的なコマンドの紹介Arthasに入ると、いくつかの基本的な操作を実行できます。以下はLinuxに似た、私がよく使うコマンドです。読者の皆様は、さらに詳しい情報を得るためにこれらのコマンドを参照してください。
ここで簡単なデモンストレーションを行います。pwdの出力は、監視対象のJavaプロセスが配置されているファイルディレクトリであることがわかります。 たとえば、ヒープメモリの使用量を確認するときに、古い世代のデータのみを表示する場合は、grep を使用できます。 「終了」をクリックすると、現在のクライアントプロセスが直接終了します。「停止」も同様の動作をしますが、通常はクライアントだけでなく、サーバーと他のクライアントも強制終了します。ここではその説明は省略します。 4. クイックスタート設定Arthasを素早く起動するための、私独自の設定方法もご紹介します。まず、arthas-boot.jarの起動手順を含むas.shというスクリプトをvimで編集します。 スクリプトを完了し、起動が成功したことを確認したら、次の内容を含むエイリアスを使用してこのスクリプトを /etc/profile に追加します: sh コマンドの後にスクリプトのフルパスが続きます。 次に、ソース ディレクティブを使用してこれを有効にします。 ご覧のとおり、この設定を完了すると、`as` コマンドを直接使用して Arthas をすばやく起動できます。 III. Arthasでよく使われる操作・メンテナンスコマンド1. リアルタイムデータパネルを表示する日々の開発・保守プロセスにおいて、プロジェクトの検査は非常に重要です。Arthasのダッシュボードは、現在のシステムにおけるプロセスの実行状況を非常に直感的に把握できます。 Arthasのコントロールパネルで「ダッシュボード」と入力してください。デフォルトでは5秒ごとに更新されます。 ここでは、最初のセクション「スレッド」のフィールドの意味について簡単に説明します。
2番目のセクションはメモリ使用量セクションで、各ヒープ領域とメタスペースのメモリ使用量とGC情報が記録されます。3番目のセクションはサーバーランタイムパラメータセクションで、プログラムが現在実行されているサーバーのカーネルバージョンやJDKバージョンなどの情報が記録されます。 Arthasのコマンドラインインターフェースは`--help`オプションでアクセスできることを知っておくことが重要です。ダッシュボードを例にとると、使用方法は次のとおりです。`-i`オプションはダッシュボードの更新間隔(ミリ秒単位)を指定し、`-n`オプションは更新回数を指定します。 したがって、1 秒ごとに 1 回更新し、5 回更新する場合、対応するコマンドは次のようになります。 2. JVM情報を表示するArthas は JVM 情報の非常に直感的なビューも提供し、対応するコマンドも JVM に関連しています。 このコマンドも複数のセクションを出力します。最初のセクションを見てみましょう。ご覧のとおり、このコマンドはマシン名、JVMの起動時間、JDKのバージョン、そして設定されたJVMパラメータを明確に表示しています。 セクションはたくさんあるので、ここでは私がよく使う「スレッド」セクションと「ファイルディスクリプタ」セクションだけを紹介します。この2つのセクションを通して、スレッドのデッドロックが発生していないか、リソースが適切なタイミングで閉じられていないかなど、定期的なチェックを行うことができます。
3. ログの表示と変更`logger`コマンドは私のお気に入りの一つです。ログ設定を非常に直感的に表示してくれます。下の画像のように、現在実行中のプログラムを例にすると、次のような情報が表示されます。
もちろん、特定の名前のログ情報を表示することもできます。例えば、com.example.arthasExample.TestControllerのログ情報を表示したい場合は、コマンド「logger -n com.example.arthasExample.TestController」を直接入力します。 loggerコマンドには、ログレベルを直接変更するという便利な機能もあります。例えば、ROOTというファイルのログレベルを変更したい場合は、以下の手順で変更できます。
プログラムには次のコード スニペットが含まれており、次の API を要求すると、情報レベルのログのみが出力されます。 対応する出力は次のようになります。 次に、Arthasを使ってログレベルを直接変更します。まず、現在のクラスローダーのハッシュコードを取得する必要があります。 次に、このハッシュ コードを直接使用して次のコマンドを実行し、ログをデバッグに設定します。 デバッグ ログが表示されました: 4. JVMメモリ情報を表示する次は、私がよく使うコマンドの一つである「memory」コマンドです。「memory」を使うと、現在のメモリ使用量を監視できます。下の画像のように、「memory」コマンドを入力すると、使用メモリ、合計サイズ、最大値、各領域の使用率などの情報を確認できます。 同様に、上記の「メモリ」セクションでは各行の意味も示します。
ここでは、JVMメモリ領域の配分について簡単に説明します。メモリ命令の各フィールドの意味を理解するために、次の図を参照してください。 5. JVM環境変数を確認するArthasの`sysenv`コマンドは、システム環境変数の情報を取得するためによく使用されます。このコマンドを入力すると、以下の画像に示すように、現在のJavaプログラムで使用されているほとんどのシステム環境変数を確認できます。現在のシステムユーザー名、エンコード形式、現在のプログラムパス、クライアントIPアドレス、ポート番号などの情報が表示されます。 ヘルプ ドキュメントによると、このコマンドは個々の環境変数の照会もサポートしていますが、誰もが環境変数の名前を知っているわけではないので、あまり役に立ちません。調べて見つけなければなりません (笑)。 6. JVMシステムプロパティの表示と変更`sysprop` コマンドは、JVM のシステムプロパティを表示します。基本的に、このコマンドを使用すると、JVM のパラメータ設定情報のほとんどを表示できます。以下の出力には、JDK のバージョン、プログラム名、ログのエンコード形式、現在のシステムユーザー名などが表示されています。 7. 現在のJVMスレッドスタック情報を表示するArthasは、以下に示すように、スレッド情報を表示するための`thread`コマンドを提供しています。このコマンドは基本的に、スレッド数情報と複数のアクティブスレッドのリアルタイム情報を出力します。デフォルトでは、データはCPUインクリメント時間の降順でソートされます。 ヘルプドキュメントで提案されているように、-n オプションを使用して、最初の数個のビジースレッドのコールスタック情報を出力することも可能です。以下に示すように、最初の2つのビジースレッドを出力するには、`thread -n 2` コマンドを入力します。 Arthasは時間間隔での出力もサポートしています。例えば、5秒以内の最もビジーなスレッドを3つ一覧表示したい場合、対応するコマンドは以下のようになります。 Javaプログラムに多数のスレッドがあり、特定の状態のスレッドをフィルタリングしたい場合は、`--state` オプションを使用して指定できます。例えば、RUNNABLE状態のスレッドを出力したい場合は、`thread --state RUNNABLE` と入力して出力を取得できます。 デッドロックの問題に関しては、以下の図に示すように、-b コマンドを使用して、現在のプログラム内で他のスレッドをブロックしているスレッドがあるかどうかを特定し、確認することもできます。著者の例では、現在のプログラムにはデッドロックは発生していません。 この時点で、デッドロックをトリガーして呼び出すためのインターフェースを提供します。 この時点で、-b コマンドを入力すると、他のスレッドをブロックしているスレッドと、そのスレッドが含まれているコード セグメントが見つかります。 8. vmtoolによるJVMの制御vmtool は私が頻繁に使用するツールコマンドです。オブジェクトのクエリやガベージコレクションの強制実行などに使用できます。これらの機能の詳細については、公式ウェブサイトをご覧ください。 vmtool:https://arthas.aliyun.com/doc/vmtool.html ここで紹介したいのは、スレッドを強制的に中断する機能です。このコマンドは、特定のシナリオにおける緊急時の対応に非常に役立ちます。 プログラムが以下のインターフェースを呼び出すと、システムからCPU使用率100%の警告が出ました。このような状況では、Arthasを使用して特定のシナリオにおける緊急事態に対処できます。 `thread` コマンドを使用して、thread-1 が基本的に単一の CPU でフル稼働していることを観察し、コンソールを使用して対応する ID が 48 であることを確認しました。 この時点で、`vmtool` の `action` コマンドを使用してスレッドを中断できます。 操作が完了すると、スレッドが正常に中断されたことがわかります。 vmTool は変数の詳細の監視もサポートしています。次のインスタンス変数 dateTimeStr を例に挙げると、API リクエストごとにリアルタイムで更新されます。 dateTimeStr の現在の値を表示する場合は、vmtool のアクションを getInstances として指定し、クラスの完全なパス (この例では com.example.arthasExample.TestController) を指定して、最後に式 instances[0].dateTimeStr を入力します。これは、現在のインスタンスの dateTimeStr を取得することを意味します。 この時点で、この変数の情報を非常に直感的に監視できます。 面接でよく聞かれる質問: Arthas の統計手法の時間消費の背後にある基本原理は何ですか?以下は watch コマンドの例です。 命令から、クラスのフルパスを取得できることがわかります。推測することなく、クラスのフルパスに基づくバイトコードスタブ技術を使用してクラスを拡張し、メソッド実行の前後に時間を挿入するコードを挿入することで、時間統計を実現します。 |