1 Arthas(阿爾薩斯) 能為你做什么?
- 這個類從哪個 jar 包加載的?為什么會報各種類相關(guān)的 Exception?
- 我改的代碼為什么沒有執(zhí)行到?難道是我沒 commit?分支搞錯了?
- 遇到問題無法在線上 debug,難道只能通過加日志再重新發(fā)布嗎?
- 線上遇到某個用戶的數(shù)據(jù)處理有問題,但線上同樣無法 debug,線下無法重現(xiàn)!
- 是否有一個全局視角來查看系統(tǒng)的運行狀況?
- 有什么辦法可以監(jiān)控到JVM的實時運行狀態(tài)?
- 怎么快速定位應(yīng)用的熱點,生成火焰圖?
- 怎樣直接從JVM內(nèi)查找某個類的實例?
2 啟動arthas
curl -O https://arthas.aliyun.com/arthas-boot.jar
JAVA -jar arthas-boot.jar
啟動Arthas
3. 查看dashboard
Dashboar圖
Thread 命令圖
4 問題排查
項目正常發(fā)布,在測試環(huán)境啟動正常,在測試環(huán)境機房發(fā)布啟動正常,但是到了預(yù)發(fā)環(huán)境機房啟動發(fā)現(xiàn)是啟動到一半卡住,現(xiàn)象如下:
服務(wù)啟動到一般卡住
第一反應(yīng)是預(yù)發(fā)環(huán)境的內(nèi)存不夠?qū)е聼o法啟動(當時服務(wù)器上只剩不到700M內(nèi)存,去其他機器看該服務(wù)正常需要1個G內(nèi)存),日志輸出卡住,于是調(diào)整內(nèi)存進行發(fā)布,結(jié)果調(diào)整到了1.2g多還是不行. 于是轉(zhuǎn)換思路,開始排查gconfig和nacos這些在線程狀態(tài)中是timewating的狀態(tài).
使用Arthas命令查看thread現(xiàn)場狀態(tài)
經(jīng)過排查這些都是屬于非主線程阻塞.
開始另外換思路, 開始排查主線程中的在運行堆棧信息,由于main線程的id是1, 使用arthas中的 thread 1 命令
至此找到問題點,主線程一直在創(chuàng)建webservice連接卡住,沒有執(zhí)行其他的任務(wù)
解決辦法是進行注釋掉,后重新發(fā)布正常。
總結(jié),
- 內(nèi)存是否足夠 top free -h
- check 啟動日志
- arthas 命令查看threa time out