JAVA進程高CPU佔用故障排查

問題描述:
生產環境下的某臺tomcat7服務器,在剛發佈時的時候一切都很正常,在運行一段時間後就出現CPU佔用很高的問題,基本上是負載一天比一天高。

問題分析:
1,程序屬於CPU密集型,和開發溝通過,排除此類情況。
2,程序代碼有問題,出現死循環,可能性極大。

問題解決:
1,開發那邊無法排查代碼某個模塊有問題,從日誌上也無法分析得出。
2,記得原來通過strace跟蹤的方法解決了一臺PHP服務器CPU佔用高的問題,但是通過這種方法無效,經過google搜索,發現可以通過下面的方法進行解決,那就嘗試下吧。

解決過程:
1,根據top命令,發現PID爲2633的Java進程佔用CPU高達300%,出現故障。

2,找到該進程後,如何定位具體線程或代碼呢,首先顯示線程列表,並按照CPU佔用高的線程排序:
[root@localhost logs]# ps -mp 2633 -o THREAD,tid,time | sort -rn

顯示結果如下:
USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME
root     10.5  19    - -         -      -  3626 00:12:48
root     10.1  19    - -         -      -  3593 00:12:16

找到了耗時最高的線程3626,佔用CPU時間有12分鐘了!

將需要的線程ID轉換爲16進制格式:
[root@localhost logs]# printf "%x\n" 3626
e18

最後打印線程的堆棧信息:
[root@localhost logs]# jstack 2633 |grep e18 -A 30


將輸出的信息發給開發部進行確認,這樣就能找出有問題的代碼。
通過最近幾天的監控,CPU已經安靜下來了。


原出處:http://blog.chinaunix.net/uid-10449864-id-3463151.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章