在實際工作中很多的服務(wù)都使用docker部署,如果直接在服務(wù)器中使用Arthas則找不到運行的服務(wù)而無法使用Arthas進行診斷,因此需要進入到容器內(nèi)部才能使用Arthas進入診斷。
進入服務(wù)器下載arthas-boot
curl -O https://arthas.aliyun.com/arthas-boot.jar
復(fù)制arthas-boot到容器內(nèi)
復(fù)制arthas到容器內(nèi)根目錄下
docker cp arthas-boot.jar d78b2477186c:/arthas-boot.jar
進入容器內(nèi)部
docker exec -it d78b2477186c bash;
運行arthas
java -jar arthas-boot.jar
輸入arthas命令
輸入命令dashboard就可以看到,到這里就可以對服務(wù)進行診斷了,具體的arthas命令見官方文檔或安裝idea插件
Arthas 官方的工具還不夠足夠的簡單,需要記住一些命令,特別是一些擴展性特別強的高級語法,比如ognl獲取spring context 為所欲為,watch、trace 不夠簡單,需要構(gòu)造一些命令工具的信息,因此只需要一個能夠簡單處理字符串信息的插件即可使用。當在處理線上問題的時候需要最快速、最便捷的命令,因此插件還是有存在的意義和價值的。
常用命令
jvm 相關(guān)
- dashboard - 當前系統(tǒng)的實時數(shù)據(jù)面板
- getstatic - 查看類的靜態(tài)屬性
- heapdump - dump java heap, 類似 jmap 命令的 heap dump 功能
- jvm - 查看當前 JVM 的信息
- logger - 查看和修改 logger
- mbean - 查看 Mbean 的信息
- memory - 查看 JVM 的內(nèi)存信息
- ognl - 執(zhí)行 ognl 表達式
- perfcounter - 查看當前 JVM 的 Perf Counter 信息
- sysenv - 查看 JVM 的環(huán)境變量
- sysprop - 查看和修改 JVM 的系統(tǒng)屬性
- thread - 查看當前 JVM 的線程堆棧信息
- vmoption - 查看和修改 JVM 里診斷相關(guān)的 option
- vmtool - 從 jvm 里查詢對象,執(zhí)行 forceGc
class/classloader 相關(guān)
- classloader - 查看 classloader 的繼承樹,urls,類加載信息,使用 classloader 去 - getResource
- dump - dump 已加載類的 byte code 到特定目錄
- jad - 反編譯指定已加載類的源碼
- mc - 內(nèi)存編譯器,內(nèi)存編譯.java文件為.class文件
- redefine - 加載外部的.class文件,redefine 到 JVM 里
- retransform - 加載外部的.class文件,retransform 到 JVM 里
- sc - 查看 JVM 已加載的類信息
- sm - 查看已加載類的方法信息
monitor/watch/trace 相關(guān)
注意
請注意,這些命令,都通過字節(jié)碼增強技術(shù)來實現(xiàn)的,會在指定類的方法中插入一些切面來實現(xiàn)數(shù)據(jù)統(tǒng)計和觀測,因此在線上、預(yù)發(fā)使用時,請盡量明確需要觀測的類、方法以及條件,診斷結(jié)束要執(zhí)行 stop 或?qū)⒃鰪娺^的類執(zhí)行 reset 命令。
monitor - 方法執(zhí)行監(jiān)控
- stack - 輸出當前方法被調(diào)用的調(diào)用路徑
- trace - 方法內(nèi)部調(diào)用路徑,并輸出方法路徑上的每個節(jié)點上耗時
- tt - 方法執(zhí)行數(shù)據(jù)的時空隧道,記錄下指定方法每次調(diào)用的入?yún)⒑头祷匦畔ⅲ⒛軐@些不同的時間下調(diào)用進行觀測
解決方法重載
tt -t *GetSysConfigImpl getSysConfig params.length==1
通過制定參數(shù)個數(shù)的形式解決不同的方法簽名,如果參數(shù)個數(shù)一樣,你還可以這樣寫
tt -t *GetSysConfigImpl getSysConfig 'params[1].key instanceof String'
解決指定參數(shù)
tt -t *GetSysConfigImpl getSysConfig params[1].key == "memberFee_page_address""
查看所有的監(jiān)測數(shù)據(jù)
tt -l
查看指定條件的監(jiān)測數(shù)據(jù)
tt -s 'method.name=="getSysConfig"'
查看index的調(diào)用信息
tt -i 1000
發(fā)起一次調(diào)用
tt -i 1000 -p
指定多少次調(diào)用
tt -i 1000 -p --replay-times 2
指定多少次調(diào)用,每次調(diào)用時間間隔
tt -i 1000 -p --replay-times 2 --replay-interval 2000 - watch - 方法執(zhí)行數(shù)據(jù)觀測
profiler/火焰圖
- profiler - 使用async-profiler對應(yīng)用采樣,生成火焰圖
- jfr - 動態(tài)開啟關(guān)閉 JFR 記錄
鑒權(quán)
- auth - 鑒權(quán)
options
- options - 查看或設(shè)置 Arthas 全局開關(guān)
管道
Arthas 支持使用管道對上述命令的結(jié)果進行進一步的處理,如 sm java.lang.String * | grep 'index'
- grep - 搜索滿足條件的結(jié)果
- plaintext - 將命令的結(jié)果去除 ANSI 顏色
- wc - 按行統(tǒng)計輸出結(jié)果
后臺異步任務(wù)
當線上出現(xiàn)偶發(fā)的問題,比如需要 watch 某個條件,而這個條件一天可能才會出現(xiàn)一次時,異步后臺任務(wù)就派上用場了
- 使用 > 將結(jié)果重寫向到日志文件,使用 & 指定命令是后臺運行,session 斷開不影響任務(wù)執(zhí)行(生命周期默認為 1 天)
trace cn.xxx.abc.system.service.dsfimpl.GetSysConfigImpl getSysConfig & - jobs - 列出所有
- kill - 強制終止任務(wù) job jobs/ kill job-id
- fg - 將暫停的任務(wù)拉到前臺執(zhí)行 fg job-id
- bg - 將暫停的任務(wù)放到后臺執(zhí)行 bg job-id
- 后臺執(zhí)行重定向
trace cn.xxx.abc.system.service.dsfimpl.GetSysConfigImpl getSysConfig >> tmt/arthas.log &
基礎(chǔ)命令
- base64 - base64 編碼轉(zhuǎn)換,和 linux 里的 base64 命令類似
- cat - 打印文件內(nèi)容,和 linux 里的 cat 命令類似
- cls - 清空當前屏幕區(qū)域
- echo - 打印參數(shù),和 linux 里的 echo 命令類似
- grep - 匹配查找,和 linux 里的 grep 命令類似
- help - 查看命令幫助信息
- history - 打印命令歷史
- keymap - Arthas 快捷鍵列表及自定義快捷鍵
- pwd - 返回當前的工作目錄,和 linux 命令類似
- quit - 退出當前 Arthas 客戶端,其他 Arthas 客戶端不受影響
- reset - 重置增強類,將被 Arthas 增強過的類全部還原,Arthas 服務(wù)端關(guān)閉時會重置所有增強過的類
- session - 查看當前會話的信息
- stop - 關(guān)閉 Arthas 服務(wù)端,所有 Arthas 客戶端全部退出
- tee - 復(fù)制標準輸入到標準輸出和指定的文件,和 linux 里的 tee 命令類似
- version - 輸出當前目標 Java 進程所加載的 Arthas 版本號