最近在極客時間學(xué)習(xí)性能調(diào)優(yōu)的東西,寫個文章,做個筆記,逼自己做一些驗證,也算學(xué)習(xí)有個輸出。
一、計算機的哪些資源可能成為系統(tǒng)瓶頸
-
CPU
- 代碼遞歸導(dǎo)致的無限循環(huán);
- 正則表達(dá)式引起的回溯;
- JVM 頻繁的 FULL GC;
- 以及多線程編程造成的大量上下文切換。
-
內(nèi)存
- 內(nèi)存溢出
- 內(nèi)存泄漏
磁盤IO
網(wǎng)絡(luò)
-
代碼異常
- 構(gòu)建異常棧為什么消耗系統(tǒng)性能?
數(shù)據(jù)庫
鎖競爭
二、測試-分析-調(diào)優(yōu)-
測試:
- 微基準(zhǔn)性能測試:對某個接口,某個方法。
- 宏基準(zhǔn)性能測試:考慮測試環(huán)境,測試場景和測試目標(biāo)。
- 注意問題:熱身問題(JAVA代碼的)、結(jié)果不穩(wěn)定(繪個平均曲線圖)、多JVM情況(線上多個tomcat的情況)。
-
分析:
- rt、tps;
- cpu、內(nèi)存、網(wǎng)絡(luò)IO
- 日志,jvm的gc頻率、堆內(nèi)存分配情況
- 代碼問題,數(shù)據(jù)庫等,各個線程池配置等。
-
調(diào)優(yōu):
- 優(yōu)化代碼
- 優(yōu)化設(shè)計
- 優(yōu)化算法
- 時間換空間
- 空間換時間
- 參數(shù)調(diào)優(yōu),jvm參數(shù),線程池參數(shù)
-
兜底策略
- 限流
- 橫向擴容
- 提前擴容