arthas 阿爾薩斯
這種命令行的東西首先得知道 如何使用幫助,幫助文檔最先開始用的,應該是可以在網上找到的官方文檔
文檔一:https://alibaba.github.io/arthas/index.html ,然后這個文檔只是給出了一些常用的例子,並沒有詳細的寫出每一個參數,需要使用命令行幫助才能看到完整參數及其示例
文檔二:命令行幫助,help
命令列出了當前版本可以使用的命令列表,在使用某一個命令時,不知道有哪些參數可以用時可以使用 <command> -h
查看示例及參數列表和每個參數的意思
文檔三:百度,google ,官網 github issues https://github.com/alibaba/arthas/issues
下載和安裝
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar
初次使用時的一些問題
[ERROR] Target process 116477 is not the process using port 3658, you will connect to an unexpected process.
[ERROR] 1. Try to restart arthas-boot, select process 90686, shutdown it first with running the 'stop' command.
[ERROR] 2. Or try to use different telnet port, for example: java -jar arthas-boot.jar --telnet-port 9998 --http-port -1
這個問題初用者必出,原因為 arthas 選擇一個應用進行診斷時弄了一個 session,可以使用 arthas-client ,web arthas client 進行登錄,這個提示告訴你要先關閉以前的 arthas-boot ,或者重新選擇一個端口
你可以這么做,在 ~/.arthas/lib/3.1.7/arthas
下有一個 arthas-client.jar
使用 java -jararthas-client.jar
可以進入上次的 session ,shutdown 后就可以選擇其它的進程進行診斷了,或者你可以繼續診斷當前應用
docker 如何使用
官網已經有例子了,這樣
docker exec -it arthas-demo /bin/sh -c "java -jar /opt/arthas/arthas-boot.jar"
常見使用示例
arthas 默認是通配符匹配,可以開啟正則匹配
用到后面,需要了解表達式核心變量 https://alibaba.github.io/arthas/advice-class.html
查詢類加載器,類和類的所有方法,類源碼
classloader 用來查詢類加載器,以樹狀結構展示類加載器 classloader -t
sc 用來查詢類,全稱為 search-class ,如要查所有的 controller ,一般取名是有規則的 sc *Controller*
,查詢單個類時,加 -d 參數可以看到詳細信息,一般用來 看這個類是哪個類加載器加載的
sm 用來查詢類的方法,全稱為 search-method ,如要查當前查到 Controller 的所有的接口,選擇某一個 Controller sm xx.xx.xx.xxxController
jad 用來在線反編譯代碼,可以用來查看線上代碼是否已經更新
查看接口出入參,並重新發起請求 tt
第一步,先監控方法 tt -t classFullName methodName
,發起請求后,會展示一個請求列表,第一列為requestId
第二步,另啟一個 arthas-client,執行 tt -i <requestId>
可以看到請求入參和出參,使用 -x 參數可以增加展示深度,看到更詳細的信息,例如:tt -i <requestId> -x 3
如果在調試,需要使用同樣的參數重新發起請求,只需要執行 tt -i <requestId> -p
就可以重新發起調用
查詢出慢方法 trace
trace classFullName methodName -n 3 '#cost > 10'
監控方法調用 3 次,並找出花費時長超過 10ms 的節點
注:trace 只會監控一層子調用
找到 applicationContext 獲取 bean
比較通用一點的辦法是監控 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter 類的 invokeHandlerMethod 方法,因為所有的請求都會經過這里,然后這個類有一個方法是獲取 applicationContext ,可以這樣做
tt -t org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter invokeHandlerMethod
然后隨便發起一個請求,再使秀 ognl 表達式獲取 applicationContext 對象
之后就可以調用方法了
tt -i 1000 -w 'target.getApplicationContext().getBean("groupMembersController").detail("1")'
上面只是調了一個字符串的參數,如果需要調用復雜參數的方法,就需要了解下 ognl 表達式了,可以使用 ognl 表達式來創建對象
查看 Jvm 參數並設置 vmoption
可能 Jdk 提供的工具也有這樣的功能,但這個可以有網頁客戶端,使用 Jdk 提供的工具類需要在本機調用,可能由於公司用戶權限的原因可能使用不了,那這玩意就有用了。
使用這個命令必須使用 Jvm 參數的全稱,簡稱是不支持的,並且要求大小寫完全匹配,后面跟一個參數用於顯示值,兩個用於設置值
可以在這個文檔查找全稱 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BGBCIEFC
常見全稱:
-Xms and -Xmx (or: -XX:InitialHeapSize and -XX:MaxHeapSize)
-Xss (or -XX:ThreadStackSize)
引入 issues 上的一張圖來說明 arthas 的使用,可以當操作手冊 ,圖片較大,可以下載下來看,清晰點
我的博文大綱:https://blog.csdn.net/sanri1993/article/details/52201255