1. 性能優化是什么?
1.1 性能優化就是發揮機器本來的性能
1.2 性能瓶頸在哪里,木桶效應。
CPU占用過高
1、現象重現
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(); }
2、定位方法
首先可以確定占用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. 術語
吞吐量:對單位時間內完成的工作量的度量
平均響應時間:提交請求和返回該請求的響應之間使用的時間
平均響應時間越短,系統吞吐量越大;平均響應時間越長,系統吞吐量越
小;但是,系統吞吐量越大,未必平均響應時間越短;因為在某些情況(例
如,不增加任何硬件配置)吞吐量的增大,有時會把平均響應時間作為犧牲,
來換取一段時間處理更多的請求。
4、top找到CPU過高的那行代碼
4.1、top 找到Pid,shift+h,找到tid
4.2、jstack pid > p.txt 導出線程dump
4.3、把線程號找到16進制 printf "%x \n" tid
4.4、在p.txt中找到16進制對應的線程信息
5、heap內存分析
jmap -heap 23451
jmap -dump:format=b,file=aa 23451
獲取文件之后使用MAT去查看內存被占用的對象。