LINUX類主機JAVA應用程序占用CPU、內存過高分析手段


本文轉載 線上應用故障排查之一:高CPU占用 DBA+社群(dbaplus)丁啟良

1. 應用程序占用資源高問題

目前大部分應用程序采用的是JAVA語言開發,在產品上線使用一段時間后,經常會出現某個JAVA程序占用的CPU,內存過高,而且幾乎從不釋放,導致系統卡頓,用戶使用變慢,如果要恢復,則必須殺掉該進程或重啟該服務,然后進行此操作時,必定會導致業務中斷。

程序主要由代碼組成,優化則需要知道是哪段代碼占用資源,並且一個應用占用CPU很高,除了確實是計算密集型應用之外,通常原因都是出現了死循環,所以通過優化代碼來降低應用程序的資源消耗或者在應用的使用過程中減少死循環則必不可少。

 

2. 問題分析

2.1. CPU過高分析

1)使用TOP命令查看CPU、內存使用狀態可以發現CPU占用主要分為兩部分,一部分為系統內核空間占用CPU百分比,一部分為用戶空間占用CPU百分比。其中CPU狀態中標示id的為空閑CPU百分比。當空閑CPU百分比越低,說明CPU占用率越高。

2)初步分析可以發現其中主要占用CPU的進程為java子進程jerrySsh服務(用戶訪問資源使用的監聽服務),在用戶量不大的情況下,CPU消耗資源很大。根據研發反饋字符網關設定的最大訪問量可達到500/台,目前字符網關的資源使用現狀無法滿足設定的要求。

● 分析手段

目前針對Linux下java進程占用CPU高的分析手段主要為使用linux命令查出高CPU使用的進程,前分析其是由於進程原因還是系統原因,在分析出為進程消耗過高CPU后列出占用CPU高和占用時間最長的線程並使用jdk自帶的jstack工具進行分析CPU使用分析

分析過程:

  1. 根據top命令,發現PID為13033的Java進程占用CPU %id 50%以上,占用CPU過高

  2. 找到該進程后,首先顯示線程列表,並按照CPU占用高的線程排序,命令為:ps mp 13033 -o THREAD,tid,time|sort -rn -k 2

  3. 找到了耗時最高的線程28358,占用CPU時間達8分多鍾。將需要的線程ID轉換為16進制格式,命令為:printf "%x\n" 28358 例如為:b0d

  4. 最后打印線程的堆棧信息:jstack 2829|grep b0d -A 30

2.2. 內存使用分析

在linux的內存分配機制中,系統優先使用物理內存,當物理內存還有空閑,表示還夠用時,不會釋放其占用內存,即使占用內存的程序已經被關閉了,該程序所占用的內存用來做緩存使用,對於開啟過的程序、或是讀取剛存取過得數據會比較快,因此查看目前進程正在實際被使用的內存(used-buffers-cache),也可以認為如果交換分區(swap)沒有大量使用,物理內存(mem)還是夠用的,只有物理內存(mem)被當前進程實際占用完(沒有了buffers和cache),才會使用到交換分區(swap)。

但是從代碼的角度,目前研發人員主要關注java.lang.OutOfMemoryError: Java heap space異常,減少不必要的對象創建,同時避免內存泄漏,所以分析代碼才是我們接下來要做的主要工作;以下為字符網關分析內存占用的故障排查過程:

● 分析手段

  1. top命令:Linux命令。可以查看實時的內存使用情況。  

  2. jmap -histo:live [pid],然后分析具體的對象數目和占用內存大小,從而定位代碼。

  3. jmap -dump:live,format=b,file=xxx.xxx [pid],然后利用MAT工具分析是否存在內存泄漏。

 

3. 總結分析手段

● 分析CPU占用的方法和手段:

  1. top命令:可以查看實時的CPU使用情況。

  2. ps -ef命令:可以查看進程以及進程中線程的當前CPU使用情況以及屬於當前狀態的采樣數據。

  3. jstack:Java提供的命令。可以查看某個進程的當前線程棧運行情況。根據這個命令的輸出可以定位某個進程的所有線程的當前運行狀態、運行代碼,以及是否死鎖等等。

  4. pstack:Linux命令。可以查看某個進程的當前線程棧運行情況

● 分析內存性能的方法和技巧:

  1. top命令:可以查看實時的內存使用情況。  

  2. jmap -histo:live [pid],然后分析具體的對象數目和占用內存大小,從而定位代碼。

  3. jmap -dump:live,format=b,file=xxx.xxx [pid],然后利用MAT工具分析是否存在內存泄漏等等。

 


免責聲明!

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



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