1. 程式人生 > 實用技巧 >Linux應用服務導致系統負載過高問題排查

Linux應用服務導致系統負載過高問題排查

linux伺服器上,用uptime、top檢視系統的負載明顯過高,經過排查,發現是因為程式碼中死迴圈造成的。具體的排查過程請參照本文。

使用top命令,發現loadaverage指標值都在1附近,偏高。當然也可以用uptime。用top的好處是可以看到各個程序使用資源的一個排名。在top結果頁面,輸入P,以cpu消耗進行排名,發現有個java程序佔用了98%的cpu資源。記下該程序的pid,通過ps-f -p pid命令,可以發現該程序是tomcat程序,它提供了一個web服務。

目前程序的資訊對我們問題的排查沒有任何幫助,我們需要檢視執行緒的資訊。我們知道,jdk提供了對執行緒的監控命令jstack,但是我們直接使用此命令幫助不大。我們可以先找出消耗資源較多的執行緒,這裡又要用到top命令。top命令不僅可以檢視程序,還可以檢視執行緒。使用top-p pid,只對該程序進行監控,進入介面後,輸入H,可以檢視該程序下各執行緒使用資源的情況。截圖如下:

可以看出執行緒20591消耗資源較多。

接下來,我們就需要看看這個執行緒到底幹了什麼事情。此時就需要用到jdk提供的jstack工具了。

將執行緒棧打出來:jstack -F pid,截圖如下:

jstack會將程序下所有執行緒資訊打印出來,上圖只是截取了部分執行緒資訊。根據執行緒號,可以找到對應的執行緒棧。

通過執行緒棧,找到對應的java程式碼,發現是因為死迴圈導致。修改程式碼重新部署,系統恢復正常。


轉載於:https://blog.51cto.com/bosszhang/2139180