性能分析

服務忽然運行慢了

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))。

相關文章
相關標籤/搜索