筆記:
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、是一個典型得需要通過打印堆棧才能排查得高負載問題