作者:MartinDai
原文:https://segmentfault.com/a/1190000014618329

Arthas 能爲你做什麼?

  • 這個類從哪個 jar 包加載的?爲什麼會報各種類相關的 Exception?
  • 我改的代碼爲什麼沒有執行到?難道是我沒 commit?分支搞錯了?
  • 遇到問題無法在預發 debug 一下,難道只能通過加日誌再重新預發佈嗎?
  • 線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現,怎麼辦?
  • 是否有一個全局視角來查看系統的運行狀況?
  • 有什麼辦法可以監控到容器和中間件的實時運行狀態?

Arthas 是基於 Greys 進行二次開發的全新在線診斷工具,利用Java6的Instrumentation特性,動態增強你所指定的類,獲取你想要到的信息,採用命令行交互模式,同時提供豐富的 Tab 自動補全功能,讓你在定位、分析診斷問題時看每一個操作都看起來是那麼的 666。

Arthas安裝及使用

下載壓縮包,上傳到需要被診斷的機器, 解壓縮

  • 安裝: 執行 ./install.sh
  • 啓動: 執行 ./as.sh pid

常用命令

dashboard

當前系統的實時數據面板

thread

查看當前 JVM 的線程堆棧信息

jvm

查看當前 JVM 的信息

sc

查看JVM已加載的類信息

sm

查看已加載類的方法信息

jad

反編譯指定已加載類的源碼

classloader

查看classloader的繼承樹,urls,類加載信息,使用classloader去getResource

monitor

方法執行監控

watch

方法執行數據觀測

trace

方法內部調用路徑,並輸出方法路徑上的每個節點上耗時

stack

輸出當前方法被調用的調用路徑

tt

方法執行數據的時空隧道,記錄下指定方法每次調用的入參和返回信息,並能對這些不同的時間下調用進行觀測

reset

重置增強類,將被 Arthas 增強過的類全部還原,Arthas 服務端關閉時會重置所有增強過的類

quit

退出當前 Arthas 客戶端,其他 Arthas 客戶端不受影響

shutdown

關閉 Arthas 服務端,所有 Arthas 客戶端全部退出

dashboard

參數解釋

ID: Java級別的線程ID,注意這個ID不能跟jstack中的nativeID一一對應

NAME: 線程名

GROUP: 線程組名

PRIORITY: 線程優先級, 1~10之間的數字,越大表示優先級越高

STATE: 線程的狀態

CPU%: 線程消耗的cpu佔比,採樣100ms,將所有線程在這100ms內的cpu使用量求和,再算出每個線程的cpu使用佔比。

TIME: 線程運行總時間

INTERRUPTE: 線程當前的中斷位狀態

DAEMON: 是否是daemon線程


在線診斷神器Arthas使用指南


thread

參數說明

id

線程id

-n

指定最忙的前N個線程並打印堆棧

b

找出當前阻塞其他線程的線程

-i

指定cpu佔比統計的採樣間隔,單位爲毫秒

PS: 這裏的cpu統計的是,一段採樣間隔內,當前JVM裏各個線程所佔用的cpu時間佔總cpu時間的百分比。其計算方法爲: 首先進行一次採樣,獲得所有線程的cpu的使用時間(調用的是java.lang.management.ThreadMXBean#getThreadCpuTime這個接口),然後睡眠一段時間,默認100ms,可以通過-i參數指定,然後再採樣一次,最後得出這段時間內各個線程消耗的cpu時間情況,最後算出百分比。注意: 這個統計也會產生一定的開銷(JDK這個接口本身開銷比較大),因此會看到as的線程佔用一定的百分比,爲了降低統計自身的開銷帶來的影響,可以把採樣間隔拉長一些,比如5000毫秒。


在線診斷神器Arthas使用指南


sc

參數說明

class-pattern

類名錶達式匹配

-d

輸出當前類的詳細信息,包括這個類所加載的原始文件來源、類的聲明、加載的ClassLoader等詳細信息。如果一個類被多個ClassLoader所加載,則會出現多次

-E

開啓正則表達式匹配,默認爲通配符匹配

-f

輸出當前類的成員變量信息(需要配合參數-d一起使用)

-x

指定輸出靜態變量時屬性的遍歷深度,默認爲 0,即直接使用 toString 輸出

PS: class-pattern支持全限定名,如com.test.AAA,也支持com/test/AAA這樣的格式,這樣,我們從異常堆棧裏面把類名拷貝過來的時候,不需要在手動把/替換爲.啦,

sc 默認開啓了子類匹配功能,也就是說所有當前類的子類也會被搜索出來,想要精確的匹配,請打開options disable-sub-class true開關


在線診斷神器Arthas使用指南


sm

參數說明

class-pattern

類名錶達式匹配

method-pattern

方法名錶達式匹配

-d

展示每個方法的詳細信息

-E

開啓正則表達式匹配,默認爲通配符匹配

PS:查看已加載類的方法信息, “Search-Method” 的簡寫,這個命令能搜索出所有已經加載了 Class 信息的方法信息。

sm 命令只能看到由當前類所聲明 (declaring) 的方法,父類則無法看到


在線診斷神器Arthas使用指南


monitor

monitor 命令是一個非實時返回命令,實時返回命令是輸入之後立即返回,而非實時返回的命令,則是不斷的等待目標 Java 進程返回信息,直到用戶輸入 Ctrl+C 爲止。服務端是以任務的形式在後臺跑任務,植入的代碼隨着任務的中止而被不會被執行,所以任務關閉後,不會對原有性能產生太大影響,而且原則上,任何 Arthas 的命令也不會引起任何原有業務邏輯的改變

參數說明

class-pattern

類名錶達式匹配

method-pattern

方法名錶達式匹配

-c

統計週期,默認值爲120秒

監控項

timestamp 時間戳

class java類

method 方法(構造方法、普通方法)

total 調用次數

success 成功次數

fail 失敗次數

rt 平均rt

fail-rate 失敗率

PS:方法執行監控, 對匹配 class-pattern/method-pattern的類、方法的調用進行監控。


在線診斷神器Arthas使用指南


trace

方法內部調用路徑,並輸出方法路徑上的每個節點上耗時, trace 命令能主動搜索 class-pattern/method-pattern 對應的方法調用路徑,渲染和統計整個調用鏈路上的所有性能開銷和追蹤調用鏈路。

trace 能方便的幫助你定位和發現因 RT 高而導致的性能問題缺陷,但其每次只能跟蹤一級方法的調用鏈路

trace 在執行的過程中本身是會有一定的性能開銷,在統計的報告中並未像 JProfiler 一樣預先減去其自身的統計開銷。所以這統計出來有些許的不準,渲染路徑上調用的類、方法越多,性能偏差越大。但還是能讓你看清一些事情的。

參數說明

class-pattern

類名錶達式匹配

method-pattern

方法名錶達式匹配

condition-express

條件表達式

-n

命令執行次數

#cost

方法執行耗時

PS: 很多時候我們只想看到某個方法的rt大於某個時間之後的trace結果,例如trace *StringUtils isBlank '$cost>100'表示當執行時間超過100ms的時候,纔會輸出trace的結果。


在線診斷神器Arthas使用指南


stack

輸出當前方法被調用的調用路徑, 很多時候我們都知道一個方法被執行,但這個方法被執行的路徑非常多,或者你根本就不知道這個方法是從那裏被執行了,此時你需要的是 stack 命令。

參數說明

class-pattern

類名錶達式匹配

method-pattern

方法名錶達式匹配

condition-express

條件表達式

-n

執行次數限制


在線診斷神器Arthas使用指南


watch

方法執行數據觀測, 讓你能方便的觀察到指定方法的調用情況。能觀察到的範圍爲:返回值、拋出異常、入參,通過編寫 groovy 表達式進行對應變量的查看。

參數說明

class-pattern

類名錶達式匹配

method-pattern

方法名錶達式匹配

express

觀察表達式

condition-express

條件表達式

-b

在方法調用之前觀察(默認關閉)

-e

在方法異常之後觀察(默認關閉)

-s

在方法返回之後觀察(默認關閉)

-f

在方法結束之後(正常返回和異常返回)觀察 (默認開啓)

-x

指定輸出結果的屬性遍歷深度,默認爲0

PS:這裏重點要說明的是觀察表達式,觀察表達式的構成主要由 groovy 表達式組成,只要是一個合法的 groovy 表達式,都能被正常支持。

觀察的維度也比較多,主要體現在參數 advice 的數據結構上。Advice 參數最主要是封裝了通知節點的所有信息。


在線診斷神器Arthas使用指南

34張架構史上最全技術知識圖譜

程序員專屬手機壁紙來了。。。

相關文章