性能優化-CPU佔用太高問題排查

1. 性能優化是什麼?
1.1 性能優化就是發揮機器原本的性能
1.2 性能瓶頸在哪裏,木桶效應。
 
CPU佔用太高
一、現象重現
CPU佔用太高通常狀況是代碼中出現了循環調用,最容易出現的狀況有幾種:
a)遞歸調用,退出機制設計的不夠合理;
b)定時器啓動過頻繁;
c)代碼出現死循環
 GC頻繁也可能致使CPU佔用太高
我用最簡單的死循環來舉例:
while (true){
        ...
}
執行後用top 命令查看系統狀況
這個時候能夠看大pid 21270 的進程 cpu佔用率爲100%
這裏有一個小細節,就是整體cpu佔用率卻爲6.8
緣由是服務器爲多核的,而示例代碼爲單線程,只會一直佔用其中一核
 
假如在while 裏面不斷建立線程就會把整個CPU佔滿
while (true){
    Thread thread = new Thread(new MyRunnable());
    thread.start();
}
二、定位方法
首先能夠肯定佔用CPU的進程pid爲21270
而後按shift + h 能夠切換成tid(線程id)
能夠看到佔用cpu的tid爲21318
也能夠用命令# top -H -p21270 說明: -H 指顯示線程,-p 是指定進程
或者用命令ps -mp pid -o THREAD,tid,time 查看pid的線程
 
再將獲得的tid轉換成16進制
printf %x 21318 獲得 5346
 
執行
jstack -l pid > test.txt
獲得線程信息
而後再在test.txt中查找5346會看到一個nid=ox5346的異常信息
這裏能夠很清晰的看到是TestController類的28行有問題(此處是一個死循環)
 
 以上是一次代碼致使cpu佔用太高的問題排查過程
 
GC過於頻繁也會致使CPU佔用太高
 
 
 
 
 
===================================待完善===============================================
2. 性能的幾個惟度
2.1 CPU
2.2 Memory
2.3 IO
2.4 network 網絡
 
2.1
命令 vmstat
首先檢查 cpu,cpu 使用率要提高而不是下降
CPU 空閒並不必定是沒事作,也有多是鎖或者外部資源瓶頸。
命令 Top
 
2.2 Memory
命令 free -h
 
 
 
2.3 IO
命令 iostat -dx 1
rrqm/s:隊列中每秒鐘合併的讀請求數量
wrqm/s:隊列中每秒鐘合併的寫請求數量
r/s:每秒鐘完成的讀請求數量
w/s:每秒鐘完成的寫請求數量
rsec/s:每秒鐘讀取的扇區數量
wsec/s:每秒鐘寫入的扇區數量
avgrq-sz:平均請求扇區的大小
avgqu-sz:平均請求隊列的長度
await:平均每次請求的等待時間
svctm:平均每次請求的服務時間
util:設備的利用率
注:建議對照源代碼來記憶這些參數都是如何計算出來的。
 
 
2.4 Network
命令 nicstat (須要安裝)
wget http://sourceforge.net/projects/nicstat/files/nicstat-1.92.tar.gz
tar -zxvf nicstat-1.92.tar.gz
sudo vim Makefile
CFLAGS = $(COPT) -m32#將此行修改成以下:
CFLAGS = $(COPT)
sudo make -f Makefile install
 
3. 術語
吞吐量:對單位時間內完成的工做量的度量
平均響應時間:提交請求和返回該請求的響應之間使用的時間
平均響應時間越短,系統吞吐量越大;平均響應時間越長,系統吞吐量越
小;可是,系統吞吐量越大,未必平均響應時間越短;由於在某些狀況(例
如,不增長任何硬件配置)吞吐量的增大,有時會把平均響應時間做爲犧牲,
來換取一段時間處理更多的請求。
 
 
四、top找到CPU太高的那行代碼
4.一、top 找到Pid,shift+h,找到tid
4.二、jstack pid > p.txt 導出線程dump
4.三、把線程號找到16進制 printf "%x \n" tid
4.四、在p.txt中找到16進制對應的線程信息
 
 
五、heap內存分析
jmap -heap 23451
jmap -dump:format=b,file=aa 23451
獲取文件以後使用MAT去查看內存被佔用的對象。
相關文章
相關標籤/搜索