在實際工作中很多的服務都使用docker部署,如果直接在伺服器中使用Arthas則找不到運作的服務而無法使用Arthas進行診斷,是以需要進入到容器内部才能使用Arthas進入診斷。
1.進入伺服器下載下傳arthas-boot
curl -O https://arthas.aliyun.com/arthas-boot.jar
[root@localhost data-service-search]# curl -O https://arthas.aliyun.com/arthas-boot.jar
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 138k 100 138k 0 0 301k 0 --:--:-- --:--:-- --:--:-- 301k
2.複制arthas-boot到容器内
# 複制arthas到容器内根目錄下
docker cp arthas-boot.jar d78b2477186c:/arthas-boot.jar
#進入容器内部
docker exec -it d78b2477186c bash;
3.運作arthas
java -jar arthas-boot.jar
root@d78b2477186c:/# java -jar arthas-boot.jar
[INFO] JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64/jre
[INFO] arthas-boot version: 3.6.7
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 1 data-service-search.jar
1
[INFO] Start download arthas from remote server: https://arthas.aliyun.com/download/3.6.7?mirror=aliyun
[INFO] File size: 12.92 MB, downloaded size: 8.95 MB, downloading ...
[INFO] Download arthas success.
[INFO] arthas home: /root/.arthas/lib/3.6.7/arthas
[INFO] Try to attach process 1
Picked up JAVA_TOOL_OPTIONS:
[INFO] Attach process 1 success.
[INFO] arthas-client connect 127.0.0.1 3658
,---. ,------. ,--------.,--. ,--. ,---. ,---.
/ O \ | .--. ''--. .--'| '--' | / O \ ' .-'
| .-. || '--'.' | | | .--. || .-. |`. `-.
| | | || |\ \ | | | | | || | | |.-' |
`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
wiki https://arthas.aliyun.com/doc
tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html
version 3.6.7
main_class
pid 1
time 2022-12-04 10:29:31
[arthas@1]$
4.輸入arthas指令
輸入指令dashboard就可以看到,到這裡就可以對服務進行診斷了,具體的arthas指令見官方文檔或安裝idea插件
Arthas 官方的工具還不夠足夠的簡單,需要記住一些指令,特别是一些擴充性特别強的進階文法,比如ognl擷取spring context 為所欲為,watch、trace 不夠簡單,需要構造一些指令工具的資訊,是以隻需要一個能夠簡單處理字元串資訊的插件即可使用。當在處理線上問題的時候需要最快速、最便捷的指令,是以插件還是有存在的意義和價值的。
5.指令清單
jvm 相關
- dashboard - 目前系統的實時資料面闆
- getstatic - 檢視類的靜态屬性
- heapdump - dump java heap, 類似 jmap 指令的 heap dump 功能
- jvm - 檢視目前 JVM 的資訊
- logger - 檢視和修改 logger
- mbean - 檢視 Mbean 的資訊
- memory - 檢視 JVM 的記憶體資訊
- ognl - 執行 ognl 表達式
- perfcounter - 檢視目前 JVM 的 Perf Counter 資訊
- sysenv - 檢視 JVM 的環境變量
- sysprop - 檢視和修改 JVM 的系統屬性
- thread - 檢視目前 JVM 的線程堆棧資訊
- vmoption - 檢視和修改 JVM 裡診斷相關的 option
- vmtool - 從 jvm 裡查詢對象,執行 forceGc
class/classloader 相關
- classloader - 檢視 classloader 的繼承樹,urls,類加載資訊,使用 classloader 去 - getResource
- dump - dump 已加載類的 byte code 到特定目錄
- jad - 反編譯指定已加載類的源碼
- mc - 記憶體編譯器,記憶體編譯.java檔案為.class檔案
- redefine - 加載外部的.class檔案,redefine 到 JVM 裡
- retransform - 加載外部的.class檔案,retransform 到 JVM 裡
- sc - 檢視 JVM 已加載的類資訊
- sm - 檢視已加載類的方法資訊
monitor/watch/trace 相關
注意 請注意,這些指令,都通過位元組碼增強技術來實作的,會在指定類的方法中插入一些切面來實作資料統計和觀測,是以線上上、預發使用時,請盡量明确需要觀測的類、方法以及條件,診斷結束要執行 stop 或将增強過的類執行 reset 指令。
- monitor - 方法執行監控
- stack - 輸出目前方法被調用的調用路徑
- trace - 方法内部調用路徑,并輸出方法路徑上的每個節點上耗時
- tt - 方法執行資料的時空隧道,記錄下指定方法每次調用的入參和傳回資訊,并能對這些不同的時間下調用進行觀測
- watch - 方法執行資料觀測
profiler/火焰圖
- profiler - 使用async-profiler對應用采樣,生成火焰圖
- jfr - 動态開啟關閉 JFR 記錄
鑒權
- auth - 鑒權
options
- options - 檢視或設定 Arthas 全局開關
管道
Arthas 支援使用管道對上述指令的結果進行進一步的處理,如 sm java.lang.String * | grep 'index'
- grep - 搜尋滿足條件的結果
- plaintext - 将指令的結果去除 ANSI 顔色
- wc - 按行統計輸出結果
背景異步任務
當線上出現偶發的問題,比如需要 watch 某個條件,而這個條件一天可能才會出現一次時,異步背景任務就派上用場了,詳情請參考這裡
- 使用 > 将結果重寫向到日志檔案,使用 & 指定指令是背景運作,session 斷開不影響任務執行(生命周期預設為 1 天)
- jobs - 列出所有 job
- kill - 強制終止任務
- fg - 将暫停的任務拉到前台執行
- bg - 将暫停的任務放到背景執行
基礎指令
- base64 - base64 編碼轉換,和 linux 裡的 base64 指令類似
- cat - 列印檔案内容,和 linux 裡的 cat 指令類似
- cls - 清空目前螢幕區域
- echo - 列印參數,和 linux 裡的 echo 指令類似
- grep - 比對查找,和 linux 裡的 grep 指令類似
- help - 檢視指令幫助資訊
- history - 列印指令曆史
- keymap - Arthas 快捷鍵清單及自定義快捷鍵
- pwd - 傳回目前的工作目錄,和 linux 指令類似
- quit - 退出目前 Arthas 用戶端,其他 Arthas 用戶端不受影響
- reset - 重置增強類,将被 Arthas 增強過的類全部還原,Arthas 服務端關閉時會重置所有增強過的類
- session - 檢視目前會話的資訊
- stop - 關閉 Arthas 服務端,所有 Arthas 用戶端全部退出
- tee - 複制标準輸入到标準輸出和指定的檔案,和 linux 裡的 tee 指令類似
- version - 輸出目前目标 Java 程序所加載的 Arthas 版本号