阿里P8架構師詳解Java性能調優策略

1、性能測試


Ⅰ.測試方法

  1. 微基準性能測試
  • 能夠精準定位到某個模塊或者某個方法的性能問題,例如對比一個方法使用同步實現和非同步實現的性能差別
  1. 宏基準性能測試
  • 宏基準性能測試是一個綜合測試,須要考慮到測試環境、測試場景和測試目標
  • 測試環境:模擬線上的真實環境
  • 測試場景:在測試某個接口時,是否有其餘業務的接口也在平行運行,進而形成干擾
  • 測試目標
    • 能夠經過吞吐量和響應時間來衡量系統是否達標,若是不達標,就須要進行優化
    • 若是達標,就繼續加大測試的併發數,探底接口的TPS
    • 除了關注接口的吞吐量和響應時間外,還須要關注CPU、內存和IO的使用率狀況

Ⅱ.干擾因素

1.熱身問題

①. 在Java編程語言和環境中,.java文件編譯成.class文件後,須要經過解析器將字節碼轉換成本地機器碼才能運行java

②. 爲了節約內存和執行效率,代碼在最初被執行時,解析器會率先解析執行這段代碼算法

③. 隨着代碼被執行的次數增長,當JVM發現某個方法或代碼塊運行得很頻繁時,就會把這些代碼認定爲熱點代碼編程

  • 爲了提升熱點代碼的執行效率,在運行時,JVM將經過即時編譯器(JIT)把這些代碼編譯成與本地平臺相關的機器碼
  • 並進行各層次的優化,而後存儲在內存中,以後每次運行代碼時,直接從內存中獲取

④. 所以在剛開始運行的階段,JVM會花費很長的時間來全面優化代碼,後面就能以最高性能運行了設計模式

2. 測試結果不穩定

①. 不穩定因素:機器其餘進程的影響、網絡波動、JVM GC的不肯定性 ①. 解決方案:經過屢次測試,將測試結果求平均,只要能保證平均值在一個合理的範圍以內,而且波動不大便可性能優化

3. 多JVM

①. 任意一個JVM都擁有整個系統的資源使用權 ②. 若是一臺機器上只部署單獨的一個JVM,在作性能測試時,測試結果會很好,但一臺機器上有多個JVM,則不必定 ③. 儘可能避免線程環境一臺機器部署多個JVM服務器

2、性能分析


1.完成性能測試以後,須要輸出一份性能測試報告,測試結果須要包括網絡

  • 測試接口的吞吐量和響應時間(平均、最大、最小)
  • 服務器的CPU、內存、磁盤IO、網絡IO使用率、JVM的GC狀況

2.經過觀察性能指標,能夠發現性能瓶頸,再經過自下而上的方式分析查找問題併發

  • 首先從操做系統層面,查看系統的CPU、內存、磁盤IO、網絡IO的使用率是否存在異常
  • 再經過命令查找異常日誌,經過分析日誌,尋找致使性能瓶頸的緣由
  • 還能夠從Java應用的JVM層面下手,查看JVM的GC頻率以及內存分配狀況是否存在異常
  • 若是系統和JVM層面都沒有出現異常狀況,能夠查看應用服務業務層是否存在性能瓶頸
    • 例如Java編程的問題、讀寫數據瓶頸

3.分析查找性能問題能夠採用自下而上的方式,而解決性能問題,通常採用自上而下的方式逐級優化編程語言

3、性能調優


思路業務調優 -> 編程調優 -> 系統調優高併發

Ⅰ. 優化代碼

1.應用層的問題代碼每每會由於耗盡系統資源而暴露出來

2.例如某段代碼致使內存溢出,這每每是將JVM的內存耗盡了

  • 這會引起JVM頻繁地發生GC,致使CPU居高不下,此時也會耗盡系統的CPU資源

3.還有一些非問題代碼致使的性能問題,比較難以發現

  • 例如若是對LinkedList進行for循環遍歷,每次循環獲取元素時,都會遍歷一次list,讀效率很低
  • 優化方案:能夠採用Iterator

Ⅱ. 優化設計

1.面向對象有不少設計模式,能夠用於優化業務層以及中間件層的代碼設計,進而達到精簡代碼和提升總體性能的目的

2.例如單例模式在頻繁建立對象的場景中,能夠共享一個對象,減小頻繁建立和銷燬對象帶來的性能開銷

Ⅲ. 優化算法

1.合適的算法能夠大大提高系統性能

2.例如在不一樣的場景中,使用合適的查找算法能夠下降時間複雜度

Ⅳ. 時間換空間

1.若是系統對查詢的速度沒有很高的要求,但對存儲空間要求苛刻,能夠考慮用時間換空間

2.例如String的intern方法,能夠將重複率比較高的數據存儲在常量池,重複使用相同的對象,大大節省內存空間

  • 但因爲常量池使用的是HashMap類型,若是存儲數據過多,就會致使查詢性能降低

Ⅴ. 空間換時間

1.使用存儲空間來提高訪問速度 2.例如MySQL的分庫分表

Ⅵ. 參數調優

1.根據業務場景,合理地設置JVM的內存空間和GC算法 2.另外,合理地設置Web容器的線程池大小和Linux操做系統的內核參數

4、兜底策略


1.性能優化策略,主要爲了提升系統性能,而兜底策略,主要爲了確保系統的穩定性

2.限流

  • 對系統的入口設置最大訪問限制,參考性能測試中探底的接口TPS
  • 同時採用熔斷措施,友好地返回沒有成功的請求

3.智能橫向擴容

  • 當訪問量超過某一個閾值時,系統能夠根據需求自動橫向擴容

4.提早擴容

  • 經常使用於高併發系統,例如瞬時搶購
  • 此時智能橫向擴容沒法知足大量發生在瞬間的請求

5.Kubernetes能夠實現智能橫向擴容和提早擴容Docker服務

5、總結


寫在最後


相關文章
相關標籤/搜索