【開篇詞】
本文主要通過一些經典的高併發場景,以及一些基本的運維工具來講述一些關於高併發以及效能優化相關的內容,主要包括效能瓶頸的定位,效能調優的思路和技巧等。
【效能的衡量指標】
?什麼是效能
效能就是,在有限的時間內,使用有限的資源,完成任務。
在儲存資源成本越來越低的今天,時間,就成為了效能指標的度量單位。
衡量指標主要包括以下幾個方面:
------吞吐量和響應速度
以紅綠燈為例,我們開車到紅綠燈前,從排隊到行駛通過,這個過程花費的時間,叫響應時間,我們通過的速度,就叫響應速度。
然而,單位時間內通過的車輛總數,就叫吞吐量。
有幾個與吞吐量相關的指標:
QPS |
每秒查詢的數量 |
TPS |
每秒事務的數量 |
HPS |
每秒的HTTP請求的數量 |
在效能優化的時候,我們首先要確認優化的目標,是吞吐量還是響應速度。
二者有什麼不同呢?
響應速度是對序列任務的優化,通過優化執行步驟解決問題;
吞吐量是對並行任務的優化,通過合理利用計算資源達到目標。
------響應時間
響應時間一般代表一個任務的總處理時間,它主要有兩個指標。
最常用的,即平均響應時間(AVG),主要體現服務的平均處理時長。
一般情況下,AVG可以很好的體現響應的效率,但是在高併發應用下,由於請求量很大,所以導致某些響應時間很長的請求被很快平均掉了,沒有被體現出來;
所以,我們又引入了百分位數(Percentile),它能夠反映出應用介面的整體響應情況:
百分位數,是將響應時間從小到大排序,然後返回某一個百分位的響應時間數值。
比如比較常用的TP95 = 100ms,就代表超過95%的請求可以在100ms內返回。
對高百分位的值要求越高,對系統響應能力的穩定性要求越高。
------併發量
併發量是指系統同時能處理的請求數量,這個指標反映了系統的負載能力。
------秒開率
秒開通常指的是在1s以下將應用載入完成,是使用者體驗很重要的指標。
------正確性
這個不用多說,主要指的是介面返回資料的正確性。
【理論方法】
------木桶理論
木桶可以裝多少水,取決於最短的那塊木板。
同理,系統的整體效能,就取決於系統中最慢的元件。
------基準測試
基準測試(Benchmark)用來測試程式的最佳效能。
在java中,基準測試主要通過JMH工具進行。
【效能優化的主要技術手段】
------複用
複用優化中,主要包含以下幾個方面:
緩衝(Buffer) |
常見於對資料的暫存,然後批量傳輸或者寫入。 |
快取(Cache) |
對於已經讀取的操作,將其暫存於速度較快的區域,重複讀取的時候速度就會得到加強。 |
池化 |
參照執行緒池,避免了資源的大量建立和銷燬,以及上下文切換。 |
------計算優化
並行執行 |
|
非同步 |
將應用的同步方式修改為非同步方式 |
惰性載入 |
將有些非關鍵的圖片或者其他顯示資訊,在應用載入(無需等)結束之後慢慢載入 |
------結果集優化
在傳輸之前,將傳輸的內容進行壓縮或者簡化。
比如nginx的gzip,比如xml替換成json。
------資源衝突優化
主要是對衝突鎖的優化。
------演算法優化/高效實現
演算法優化指的是針對程式碼實現演算法的優化,高效實現指的是儘量摒棄原有的舊的效率低下的外掛以及框架,使用比較流行的技術。
------JVM 優化
主要針對java虛擬機器相關的一些優化。
一般引數比較適合的時候,效能會好很多,引數設定不當會造成OOM等後果。
目前,垃圾回收器已經廣泛使用G1,通過很少的引數配置,記憶體即可高效回收;CMS垃圾回收器在Java14中已經被移除,由於其GC時間不可控,所以在使用時應當小心注意。