1. 程式人生 > >Linux定位伺服器CPU負載100%居高不下的問題

Linux定位伺服器CPU負載100%居高不下的問題

最近,Linux伺服器上總是經常會出現幾個CPU利用率達到100%並且一直高居不下,如下圖所示,再Linux上,輸入 top 命令,然後再按一下 1,就會顯示你伺服器邏輯CPU的數量以及現在伺服器CPU各個引數,這些引數的詳細資訊我這裡就不再多講了,從下面的圖中可以看出,有四個CPU的使用率達到了100%,很明顯的,程式有問題

  

明顯的,從 top 命令很輕易的可以看出,佔據CPU不放的是Java程序,該程序的PID是19825

  

命令檢視這個程序下面的所有執行緒佔用情況ps mp pid -o THREAD,tid ,也可以通過 top -H -p pid 找到導致cpu高的執行緒 

  

  

這兩個命令查詢的結果是一樣的,都找到了這四個導致CPU居高不下的PID,1482,27308,28575,和4466而後,使用JVM自帶的jstack命令匯出當前所有執行緒的執行情況和執行緒當前狀態,jstack工具可以用來獲得core檔案的java stack和native stack的資訊,從而可以輕鬆地知道java程式是如何崩潰和在程式何處發生問題,jstack 19825 > error.log

可以把該檔案下載到本地或者直接在Linux上分析,首先,需要把剛才的四個PID 1482,27308,28575,和4466分別轉換為16進位制,在Window上可以使用計算器轉換,在Linux上一般預裝Python,可以命令列鍵入 Python,然後 print hex(num)直接轉換為16進位制:

通過該16進位制可以在上面匯出的JVM資訊中方便的定位到該執行緒的位置:

從匯出的JVM日誌檔案中分別找到了4個PID對應的執行緒位置,發現四個執行緒的狀態都處於RUNNABLE下,RUNNABLE表示該執行緒正在執行,但這裡明顯是無法停止,我又重新導了幾次JVM的狀態日誌,發現這4個執行緒總是處於RUNNABLE狀態下。

從上圖Java的呼叫關係看,也可以從 com.sun.jna.Function.invoke()方法看出,該執行緒使用JNA呼叫了本地的DLL類庫出現了問題,該DLL是第三方庫,所以要從該DLL入手。