線上系統異常linux跟蹤命令大致流程(JVM)

 
1 如果不知道CPU核數,可以先看CPU核數
mpstat -P ALL 2 1     //每2秒打印一次,並且只打印一次
其他:如何要看詳細請用sar -P ALL
 
 
 
參數
釋義
從/proc/stat獲得數據
CPU
處理器ID
 
%usr
在internal時間段裏,用戶態的CPU時間(%),不包含 nice值爲負進程
usr/total*100
%nice
在internal時間段裏,nice值爲負進程的CPU時間(%)
nice/total*100
%sys
在internal時間段裏,核心時間(%)
system/total*100
%iowait 
在internal時間段裏,硬盤IO等待時間(%)
iowait/total*100
%irq
在internal時間段裏,硬中斷時間(%)
irq/total*100
%soft
在internal時間段裏,軟中斷時間(%)
softirq/total*100
%steal
顯示虛擬機管理器在服務另一個虛擬處理器時虛擬CPU處在非自願等待下花費時間的百分比
steal/total*100
%guest
顯示運行虛擬處理器時CPU花費時間的百分比
guest/total*100
%gnice
 
gnice/total*100
%idle
在internal時間段裏,CPU除去等待磁盤IO操作外的因爲任何原因而空閒的時間閒置時間(%)
idle/total*100
 
      
2 使用top查看系統狀態
top
其中 M 內存排序,P cpu排序
top -p pid 指定某個進程id
 
 
 
可用free -h 查看內存
 
 
 
也可用df -h查看當前磁盤空間,du -h --max-depth=1 查看當前目錄下的各個目錄使用空間
 
3 上面top如果有異常,我們可以取top有異常的進程ID pid來分析
1 首先查看java GC狀態(定位JVM內存狀態)
jstat -gc 23042 5 5             //公式:jstat -gc pid [interval]
說明:主要看他的full gc老年代次數(看新生代GC也行),如果GC次數過多,可能就是內存泄漏問題了
 
 
 
4 定位JVM內存狀態發現GC異常,我們這時需要保存棧、堆的現在信息來分析
保存線程棧現場:jstack 23042 > jstack.log                            // 得到jstack.log文件
保存堆現場:jmap -dump:format=b,file=heap.log 23042                  // 得到heap.log文件
 
5 分析棧現場的日誌
統計線程數:grep 'java.lang.Thread.State' jstack.log  | wc -l
521       // 會輸出一個行數
看線程狀態是否正常: grep -A 1 'java.lang.Thread.State' jstack.log  | grep -v 'java.lang.Thread.State' | sort | uniq -c |sort -n
 
 
備註:如果對應等待或休眠過大那就可能是異常了
 
6 MAT分析堆現場日誌(由於這個日誌是二進制,所以無法直接用linux命令分析)
1 先將heap.log 日誌改爲 heap.hprof
然後使用MAT打開heap.hprof文件,選擇如下,在A點 通過報名進行過濾,比如公司項目報名前綴爲 com.lisam.xxxx,輸入"com.lisam.*" 就可以過濾出這些對象的使用頻率了。
 
 
 
7 當然還需要結合線上錯誤日誌、nginx訪問日誌、鏈路監控日誌、接口訪問日誌等來判斷系統異常,具體就要結合公司的系統架構了。
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章