關於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循環判定隊列是否為空
參考:服務器負載過高問題分析