上午收到報警,某台機器上的CPU負載過高,通過逐步的排查,解決了問題,下面記錄一下整個排查的過程。
首先,登錄上對應的機器,通過top命令找到占用CPU過高的進程ID,也就是PID,為29126, 然后通過ps命令和grep命令找到PID為29126對應的服務,具體命令如下:
ps -ef | grep 29126
結果如下:
找到對應的服務之后,可以直接查看服務打印的日志,沒有發現任何異常,所以只能通過jdk提供的JVM工具來排查問題。
先通過jdk自帶的工具jstack保存一下JVM進程對應的棧信息,具體的命令是:
jstack 29126 > 29126_stack.log
然后通過top命令找到占用CPU較多時間的線程,具體的命令如下:
top -p 29126 -H
找到目標線程的PID為22050,然后將PID轉換為16進制,可以使用printf命令,具體命令如下:
printf "%x\n" 22050
轉化結果為:5622
然后在之前保存的JVM進程的棧信息的文件中找到nid=0x5622的線程的棧信息,結果如下:
通過線程的棧信息,我們可以找到該線程在執行的代碼,然后通過排查這段代碼找出問題所在。