1. 程式人生 > 實用技巧 >伺服器負載過高問題分析-不是cpu高負載也不是IO負載如何處理(阿里 幾乎是必考題)

伺服器負載過高問題分析-不是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系統記憶體使用量和交換區使用量,如圖所示。


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迴圈判定佇列是否為空

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

摘自

https://www.cnblogs.com/aspirant/p/11476884.html