この記事はWeChatの公開アカウント「Mu Xiaonong」から転載したもので、著者はMu Xiaonongです。この記事を転載する場合は、穆小農の公式アカウントまでご連絡ください。 Arthasとはシステムで JVM やメモリ オーバーフローなどの問題が発生した場合、プログラムを効果的に監視してトラブルシューティングするにはどうすればよいでしょうか? JDK に付属する jconsole や jvisualvm など、よく使用されるツールがいくつか見つかりました。最もよく使用されるツールである jprofiler もありますが、これは有料であり、非常に裕福な企業を除いて、使用する人はほとんどいません。もう一人は今日の主人公、アルサスです。なぜ今日これに焦点を当てるのでしょうか? 公式ウェブサイトアドレス: http://arthas.gitee.io/ GitHub アドレス: https://github.com/alibaba/arthas/ Arthas は Alibaba のオープンソース Java 診断ツールです。コマンドライン対話モードを使用し、豊富な機能を提供します。これは、使いやすく強力な JVM トラブルシューティング用の無料プラグインです。このツールについて知った後、非常に使いやすく、包括的な機能をサポートしていることがわかりました。それで、Arthas は私たちに何ができるのでしょうか? 1. スレッド、CPU、メモリなどの情報を含むパフォーマンス ダッシュボードを提供し、定期的に更新します。 2. さまざまな条件に基づいてスレッドのスナップショットを表示します。 CPU使用率が最も高いn個のスレッドを見つける 3. gc アルゴリズム、jdk バージョン、ClassPath など、jvm のさまざまな情報を出力します。 4. 問題が発生してオンラインでデバッグできない場合は、ホットデプロイメントとログを直接置き換えることができます。 5. クラスの静的プロパティを表示し、OGNL構文を使用していくつかのステートメントを実行することもできます。 6. ロードされたクラスの詳細情報、クラスがどのjarパッケージからロードされたか、クラスメソッドの情報を表示します。 7. クラスのバイトコードを指定されたディレクトリにダンプする 8. 指定されたクラスを直接逆コンパイルする 9. アプリケーションのホットスポットを素早く見つけ、フレームグラフを生成する 10. JVMのリアルタイム実行状況を監視できます これまで、このような問題が発生した場合の解決策は、ほとんどの場合、コードを修正してオンラインに戻すことでした。しかし、大企業ではオンラインでの手続きは非常に面倒です。ログを 1 行追加するためだけにバージョンを再リリースする必要がある場合、それは間違いなく非常に面倒になります。しかし、Alibaba のオープンソース Arthas には、より洗練されたオンライン デバッグ方法があります。 Arthas は JDK6 をサポートしており、Linux/Mac/Windows で実行できます。自動タブ補完機能を備えているため、問題の特定や診断が容易になります。 ダウンロードアドレス: https://arthas.gitee.io/download.html zipパッケージをダウンロードできます。 arthas-packaging-3.5.0-bin.zipをダウンロードするか、コマンドでダウンロードします https://alibaba.github.io/arthas/arthas-boot.jar を取得します。 ユーザーマニュアル1. クイックスタート ダウンロードしたら、java -jar arthas-boot.jarコマンドで直接起動できますが、その前に検出コードを使用してArthasにハングアップする必要があります。
これは前回の記事で説明したケースです。興味があれば、ぜひ学んでみてください。 まず、javac コマンドを使用して Java ファイル javac FullGCTest.java をコンパイルし、リスク監視用の GC ログを印刷する必要があります。
Arthasの起動コマンド: java -jar arthas-boot.jar、取得 先ほど開始した FullGCTest アプリケーションが表示されます。数字1を入力してEnterを押します。このようにして、Arthas をプログラムに追加します。次に、対応するコマンド操作を実行するだけです。 コマンドの詳細ドキュメント: https://arthas.aliyun.com/doc/commands.html 2. 機能一覧
仮想マシン オペレーティング システム: システム関連パラメータ スレッド関連:
FILE-DESCRIPTOR (ファイル記述子関連):
スレッドコマンドパラメータの説明:
現在最もビジーなN個のスレッドを出力し、スタックを出力する
スレッド すべてのスレッドを表示 スレッド17: 指定されたスレッドの実行スタックを表示します スレッド -i: サンプリング時間間隔を指定する thread -i 1000 : 最後の 1000 ミリ秒のスレッド CPU 時間をカウントします。 thread -n 3 -i 1000 : 1000ms 以内に最もビジーな 3 つのスレッド スタックを一覧表示します。 ダッシュボードコマンド プログラムを実行すると、qps、rt、エラー数、スレッド プール情報など、現在のプログラムのリアルタイム情報が表示されます。 データの説明:
パラメータの説明:
scコマンド JVM によってロードされたクラス情報を確認します。 SC を使用すると、クラスがどの jar パッケージから読み取られたか、それがインターフェース/列挙クラスであるかどうかなど、さらにどのクラス ローダーからロードされたかなど、クラスの詳細情報を確認できます。 パラメータの説明:
sc -d *CardInfo: クラスの詳細情報を出力します sc -d -f *CardInfo: クラスのフィールド情報を出力します ヒープダンプ + jhat 分析heapdump: jmapコマンドに似ている 指定されたフォルダに作成します:
作成が成功すると、指定したフォルダーに対応するダンプ ファイルが表示され、コマンド jhat dump.hprof を使用してファイルを生成できます。成功したら、IP+ポート経由でアクセスできるようになります アクセス: その後、IP + ポート経由でアクセスできるようになります。そこには「その他」が存在します。それを一番下まで引っ張ってみると すべてのクラス(プラットフォームを含む)のインスタンス数を表示します 以下から、どのクラスに最も多くのオブジェクトが含まれているか、どのクラスが最も多くのオブジェクトを生成するかを分析できます。 最も強力な機能は、Execute Object Query Language (OQL) クエリと呼ばれ、どのオブジェクトが存在するか、オブジェクトが持つバイト数と参照数、どのオブジェクトに問題があるかを表示できます。下の図に示すように、文字列に対応するすべてのオブジェクトが表示されます。 検索後、このオブジェクトが占めるバイト数と、このオブジェクトを指す参照の数も確認できます。この OQL の構文も非常に柔軟です。 where条件を使ってフィルタリングすることができます ジャドjad: クラスの逆コンパイル、またはクラスのメソッドの逆コンパイル、動的プロキシ生成クラスの問題、サードパーティのクラスの検索 (コードの観察)、バージョンの問題 (提出された最新バージョンが使用されているかどうかの判断) これは何の役に立つのか、私自身ソースコードを知らないのか、と疑問に思う人もいるかもしれません。なぜなら、オンライン環境またはテスト環境のパッケージが私たちによって変更されたかどうかわからないことがよくあるからです。この時点で、jadデコンパイルを使用して最新のコードかどうかを確認することができます。 再定義するredafine: ホット置換、動的なコード更新、JVM を再起動する必要はありません。現在、いくつかの制限があります: メソッドの実装のみ変更できます (メソッドは完了まで実行されています)、メソッド名は変更できません、属性 m() -> mm() は変更できません たとえば、オンライン環境のクラスに問題があり、それを置き換えたい場合、サーバーを停止して再公開するしかありません。これは普通の中小企業では可能ですが、JD.comやTaobaoのような大規模企業では、プロセス全体が非常に複雑であるため、止めることはできません。私たちは何をすべきでしょうか?次のケースをご覧ください まず、新しいテストケースを作成します。
javac *.javaコマンドを使用してクラスファイルにコンパイルし、Tファイルを実行します。
a を入力すると 2 が出力されますが、オンラインになった後、1 を出力する必要があることがわかります。ローカルで変更する場合は、オンラインで再リリースする必要があります。この変更には明らかに価値がありません。ただし、再定義ホットデプロイメントを使用すると、JVM を再リリースせずに直接置き換えることができます。 次にTプログラムをArthasに取り付けます 次にTT.javaプログラムvi TT.javaを直接変更し、そこに印刷された値を2から1に変更します。
次にjavac TT.javaファイルをコンパイルして実行します。 マウントされたArthasに戻り、/usr/local/mxn/fuccGc/t/TT.classファイルを再定義します。
実行成功 ご覧のとおり、再起動せずにクラスファイルイメージを正常に置き換えました。 時計 watch: メソッド実行のデータ監視。クラスを監視するには、watch コマンドを使用できます。監視後、関数を実行してシナリオを再現します。 Arthas は、トラブルシューティングに役立つ特定の出力および入力パラメータを提供します。 トレース メソッド呼び出しパスと消費時間を出力します。この命令はコードの最適化に非常に役立ちます。各メソッドの具体的な実行時間を確認できます。 for ループなどの繰り返し文の場合は、最大消費時間、最小消費時間、n ループで消費された平均時間も確認できます。完璧! tt メソッドに対してttを有効にすると、各呼び出しの入力パラメータと戻りパラメータを記録し(監視回数の上限を設定できます)、これらの異なる時間調整を観察します。
コマンドパラメータ分析 -t tt コマンドには多くの主要なパラメータがあり、-t もその 1 つです。このパラメータは、クラス *Test の print メソッドの各実行を記録することを示します。 -n 3 呼び出し量の少ないメソッドを実行する場合は、CTRL+C を使用して tt コマンドの記録プロセスを中断するのに十分な時間があるかもしれませんが、呼び出し量が非常に多いメソッドに遭遇すると、JVM メモリが瞬時に爆発的に増加します。 このとき、-n パラメータを使用して、記録する必要がある回数を指定できます。記録数に達すると、Arthas は tt コマンドの記録プロセスを積極的に中断し、手動操作を停止できない状況を回避します。 ognl 式ognl 式 OGNL の特殊な使用法については、以下を参照してください: https://github.com/alibaba/arthas/issues/71 OGNL 式の公式ガイド: https://commons.apache.org/proper/commons-ognl/language-guide.html 静的関数を呼び出す: ognl '@[email protected]("hello")' メソッド 静的クラスの静的フィールドを取得する: ognl '@FullGCTest@random' メソッド Arthas は Web コンソールもサポートしています。https://alibaba.github.io/arthas/web-console.html を参照してください。 要約するArthas はオンライン デバッグ ツールです。他のツールと比較すると、Arthas はより包括的な機能を備えており、使いやすいです。初心者でも簡単に習得できます。記事の内容が理解できなかったり、質問がある場合は、下記にコメントを残してください。 |
SEO プロジェクトの計画には何が含まれますか?現在のクライアントの Web サイトに適した SEO...
MicrosoftInternetExplorer402DocumentNotSpecified7....
2012 年は魔法の数字です。それは世界の終わりと SEOER の終わりが予測されています。 SEO...
raksmart のロサンゼルス データ センターでは現在、安価な独立型サーバー (物理マシン) を...
H1とH2は、HTML言語のごく基本的なものです。もともと、H1〜H6はタイトルのフォーマットを制御...
Flipperhost は 6 年前に登録された会社です。主な事業は仮想ホスティング、VPS、サーバ...
VirMach のサーバーはバッファロー (ニューヨーク) でホストされており、将来的には他のデータ...
最近、武漢 SEO ブログは、パフォーマンスを向上させるためにウェブサイトを再構築してほしいという友...
ウェブサイトが良いランキングを獲得したい場合、Baidu での重みを高める方法を見つける必要がありま...
世界中のユーザーの間でデジタル プラットフォームに対する需要が高まったため、モバイル アプリケーショ...
クラウド コンピューティングは、新しいインフラストラクチャの重要な部分になりました。中国工業情報化部...
desivps からプロモーション メールが届きました。基本的には、desivps が dedipa...
hostcircle (2011~、AS210269、AS64067、AS396158) は、今年、...
「我々は困難な変革期にある。成功しなければ、我々は消滅してしまうだろう」と、Qutoutiaoの内部...
以前、「高性能ウェブサイト構築ガイド」でETagについて学んだことがありますが、実際に適用したことは...