jstack解決線上問題記錄
問題現象
之前也有看過jstack的文章,典型的案例是deadLock
和空閒線程調優。不過都不是這次遇到的問題。
這次的問題現象是容器發佈時,tomcat輸出的日誌就卡在某行日誌,需要大約半小時的時間才繼續輸出日誌並且啓動成功。啓動成功後也沒有明顯的錯誤日誌。
解決步驟
首先猜想是某個線程卡住了,一般來說是網絡資源連接。果斷使用jstack
進行導出日誌。
接着進行分析,可以直接取看文件內容,也可以通過線上或者idea的Analyze Stack Trace or Thread Dump
功能進行分析。
本次使用的是idea的方式。
這裏怎麼去找block的線程呢?
個人覺得有兩種辦法:
- 去找tomcat相關線程block的堆棧,與外部線程有關的一般就是。
- 理解tomcat的模型後,知道catalina會啓動多個host,所以localhost的waiting肯定會造成catalina的waiting。從host -> catalinade -> main的關係進行查看,查看懷疑的線程。
從堆棧中可以明顯看到是elsatic search的init造成了block。然後通過加日誌的方式證明的確是這部分代碼影響的。原來是elastic search的外部環境變化,某些節點不可用導致的。調整配置後解決。