服務器負載過高問題分析-不是cpu高負載也不是IO負載如何處理(阿里 幾乎是必考題)


關於top命令 經常問load average 參考:load average 定義(網易面試)

jvm dump的使用 參考:Jvm dump jstack jmap jstat 介紹與使用(內存與線程) 以及使用jstack定位問題

查看端口:如何在Windows,Linux下查看JAVA端口占用情況(阿里)

問題現象:

1,top命令查詢服務器負載達到2.0-5之間,tomcat的cpu使用率達到104%

 

 load average: 

linux系統中的Load對當前CPU工作量的度量。簡單的說是進程隊列的長度。

Load Average 就是一段時間 (1 分鍾、5分鍾、15分鍾) 內平均 Load 。 

問題分析過程:

1),磁盤使用率未超出正常范圍   

df -l

 

2),內存使用率未超出正常范圍還有空閑

free

 

 

 

free -m 查看linux系統內存使用量和交換區使用量,如圖所示。

查看linux系統CPU和內存命令

 


3),服務器流量未現明顯峰值

 

 


4)jvm內存狀態未現異常非GC原因

 至於具體的jstat jmap jstack 的使用情況 

參考:Jvm dump jstack jmap jstat 介紹與使用(內存與線程) 以及使用jstack定位問題

綜合初步預估是tomcat有線程一直在運行占用cpu資源 

問題引出:如何確定tomcat的100%的cpu使用率到底問題在哪? 

問題定位方案:

使用java提供的是jstack線程分析命令對進程里面的線程狀態進行分析,先導出線程快照再分析具體是那個線程及對應的類 

執行步驟:

第一步:ps -ef|grep tomcat 查詢出java/tomcat進程PID(eg:8209)

第二步:ps -aux 查詢出該進程是哪個用戶啟動的(即使ROOT用戶可能也導出線程快照失敗) 

第三步:su  tomcat 切換到進程啟動用戶

第四步:jstack -l 8209 > /usr/local/work/tomcat/8209.stack 導出PID對應的線程信息到文件

第五步:對導出的線程文件下載本地做分析(可以文本打開)

第六步:top -H -p 8209 命令查看對應進程是哪個線程占用CPU過高(eg:8308)

 

 第七步:printf "%x\n" 8308 轉換十進制為十六進制 此處為:2074

第八步:在導出的堆棧文件中搜索線程ID等於nid=0x2074的線程,此處即列出了該線程對應的類 

 第九步:根據線程信息找到對應的類定位問題成功,找到原因:日志隊列線程一直處於RUNNABLE狀態,一直在while循環判定隊列是否為空

 參考:服務器負載過高問題分析


免責聲明!

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



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