使用jstack命令查看CPU高占用的問題記錄


筆記:

1.top命令找出最高占用的進程(command為java)

2.查看高負載進程下的高負載線程:top -Hp 【PID】 (或 ps -mp PID -o THREAD,tid,time

3.找出最高占用的線程並記錄thread_id,把線程號 進行換算成16進制編號:printf "%X\n" thread_id

4.(可選)執行查看高負載的線程名稱:jstack 16143【進程】 | grep 3fb6【線程】 

5.導出進程的堆棧日志,找到3fb6 這個線程號:jstack 16143 >/home/16143.log

 

PS. 其它可能用到的命令:

1.輸入:top -H -p PID 或 ps -mp PID -o THREAD,tid,time

找出最高占用的線程並記錄thread_id

2.查看dump信息(-a 30 意思打印30行)

jstack pid |grep 16進制的thread_id -a 30

 或者導出

jstack pid |grep 16進制的thread_id -a 30 > xx.log

 

案例記錄:

定位:根據運維反饋CPU負載非常高,初步判斷是應用代碼問題,某個線程長時間在跑,占用CPU資源,比如死循環等等。

1、執行:top

查看高負載的進程

2、top -Hp 16143

查看高負載進程下的高負載線程

把線程號 16310 進行換算成16進制編號:3fb6

3、jstack 16143 | grep 3fb6

執行查看高負載的線程名稱

根據查詢到得線程名稱可以知道是消息消費線程高負載。

4、jstack 16143 >/home/16143.log

導出進程的堆棧日志,找到3fb6 這個線程號

通過跟蹤代碼,確認有問題的代碼方法。

四、問題修復

1、update操作 使用select 語句

2、修改類型為update,提交解決

五、總結

1、因為是一步線程,所以監控平台無法監控到具體代碼行數

2、線程已經卡住,沒有任何得日志信息提示

3、是一個典型得需要通過打印堆棧才能排查得高負載問題

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM