筆者最近在排查一次線上故障時, 發(fā)現(xiàn)一個很奇怪的現(xiàn)象: 線上服務(wù)啟動時振劳,沒有任何流量和訪問世剖,服務(wù)cpu使用率莫名妙達到25%翁狐。 一開始不為其然,認(rèn)為是項目中使用了公司自研的中間件像啼, 導(dǎo)致了cpu使用率偏高。后面通過排查發(fā)現(xiàn),其實是java守護線程使用方式出了問題领追,謹(jǐn)以此文章記錄下排查過程,以及反思結(jié)果响逢。
1. 查看服務(wù)器cpu 使用最高進程id
在服務(wù)器中使用top 命令绒窑,查看當(dāng)前cpu使用率排名靠前的進程id
sh> top
從上圖中可以看到 java 進程占據(jù)了cpu將近25%的使用率
2. 找出對應(yīng)的哪個子線程占據(jù)了主要的使用時間 top -H -p pid #查看異常的線程
從第一步可以看出,當(dāng)前cpu使用率最高的進程 id 是1
> top -H -p 1
從上圖找出來了對應(yīng)的子線程的 id 為66
3. 將進程id 轉(zhuǎn)為 16進制 printf "%x\n" tid
# printf "%x\n" 66
42
4. 通過jstack 命令查找出異常線程
> jstack 1|grep 0x42 -A 30
5 修改代碼
從4步驟找出來異常代碼是TopicSender.java 36行龄句。
至此回论,異常代碼定位出來, 接下來就是如何修改代碼分歇。
源代碼
源代碼很簡單傀蓉,就是一個守護線程,不停循環(huán)的運行职抡, 沒有什么異常邏輯葬燎, 百思其解了好久,想要不讓線程每運行一次就調(diào)用一次Thread.sleep()缚甩。我這邊設(shè)定了先試著 sleep 500ms 看看效果
然后就是部署谱净,查驗效果后,cpu使用率下降至2%
最后的結(jié)語
一次簡單的問題排查擅威,讓我對java的線程使用更加熟練壕探, 同時也學(xué)會了如何去排查線上服務(wù)cpu使用率偏高的手段。 同時也再次給我一次警醒郊丛。故障往往是因為不在意的小問題李请,及時發(fā)現(xiàn)問題瞧筛, 及時解決問題。