1、性能分析準備前端
一、明確系統的整體架構,明確壓力方向,好比哪個接口或者哪個模塊調用頻率最高;面臨高併發挑戰;java
二、構建測試環境測試性能,好比loadrunner性能測試等;mysql
三、瞭解系統的響應速度、吞吐量、TPS、QPS等指標需求,好比秒殺系統對響應速度和QPS的要求是很是高的。ios
2、分析思路:sql
自下而上:數據庫
一、先檢查java相關日誌是否有明顯錯誤;緩存
二、檢查CPU、內存、IO等系統級各個性能使用狀況,是否被某些進程大量佔用等;性能優化
三、若是是分佈式,不少公司會實現更加系統的日誌、性能等監控系統,好比經過JFR(java flight recorder)或JMC(java Mission Control)等生成日誌文件進行異常診斷;服務器
四、檢查數據庫服務器各項指標:系統級(CPU、內存、IO)、鏈接數、鎖網絡
五、監控java服務自身,看是否有惡劣的FULL GC狀況或者Miror GC在變長;利用jstat工具統計信息,利用jstack檢查是否有死鎖進程;
自上而下
一、從應用的頂層,定位到具體模塊,再到具體功能點,再定位到具體服務;
3、各項指標工具
CPU :
1.命令top
load average的三個值(分別是 1 分鐘、5 分鐘、15 分鐘),數值若是遠遠大於1,說明CPU出現運行瓶頸;說明某個線程在高速佔用CPU運行中;
2.經過vmstat
命令:vmstat 1 10 (每秒輸出一個,總共輸出10個)
若是每秒上下文(cs,context switch)切換很高,而且比系統中斷高不少(in,system interrupt),就代表頗有多是由於不合理的多線程調度所致使;
內存:
命令:free -h
查看內存使用狀況,進一步判斷 swap 使用狀況,JVM 是不但願發生大量的 swap 使用的;
IO:
命令:iostat
利用 iostat 等命令有助於判斷磁盤的健康情況
JVM 層面
利用 JMC、JConsole 等工具進行運行時監控。
利用各類工具,在運行時進行堆轉儲分析,或者獲取各類角度的統計數據(如 jstat -gcutil 分析 GC、內存分帶等)。
GC 日誌等手段,診斷 Full GC、Minor GC,或者引用堆積等
4、性能優化考慮點
(1)前端
gzip壓縮、動靜分離
(2)後臺應用
採用分佈式系統開發,以模塊劃分部署,針對性分配CPU、內存、IO、網絡等;
將訪問頻繁基礎數據存儲至Redis緩存中;
將變化小,運算複雜計算數據直接存儲至內存中;直接在內存中進行處理;
儘可能減小對數據庫的操做,好比查詢多對多數據,要避免for循環中查詢詳情;
將文件系統和應用系統分離,能夠採用第三方阿里OSS文件服務器系統;
(3)數據庫層面
a、SQL級:優化SQL查詢語句,減小查詢時間;
b、表級:增長索引、優化表結構,根據地區時間分區表數據;
c、庫級:採用讀寫分離;配置主從數據庫;
d、系統級:優化mysql配置文件;
e、避免查詢中在查詢中讓MYSQL自動類型轉換,轉換過程會使索引失效;
f. 儘可能想辦法使用臨時表掃描替代全表掃描;
g. 拋棄in和not in語句,使用exists和not exists替代;
h. 和客戶確認,模糊查詢是否有必要,如沒有必要,去掉like語句;
i. 注意創建適當的,符合場景的索引;
j. 踩死 "*" 號;
k. 避免在where條件中對字段進行函數操做;
l. 對實時性要求不高的報表,容許髒讀(with(nolock))。