天天看點

如何做壓測?

如何做壓測?

作者 | 冬恒

來源 | 阿裡技術公衆号

一 壓測目标

在開始做壓測計劃之前,一定要先明确壓測的目标是什麼,雖然最終的目标肯定都是優化系統的性能,但是不同的出發點,可能需要采取不同的方法。

一般來說,可能有以下一些目的:

如何做壓測?

1 挖掘系統瓶頸點,優化系統性能

尤其對新系統上線,缺乏性能基線資料,此時壓測一般沒有明确的qps/rt等名額,而是通過不斷施壓,不斷逼近系統的極限,進而暴露問題,修複問題。

2 建立性能基線

主要是為了收集系統目前的最大性能名額,一般會根據業務特點,先确定對rt和錯誤率的容忍度,然後通過壓測推算出能夠支援的最大qps, 并發量等。

同時可以結合性能名額和監控資料,來建立合理的預警機制,設立系統水位報警項,限流門檻值,彈性政策等。

量化系統能力/SLA等 (比如在競标中引用)。

3 性能回歸

對于已上線系統,或者性能需求明确的系統,可以根據線上實際的運作情況,确定系統需要支撐的qps/rt, 然後在涉及性能影響前做回歸校驗,確定性能滿足預期。

4 系統穩定性

更側重在一定壓力的情況下,系統是否能長時間穩定持續的提供SLA保障。

一般可以考慮将壓力設定到業務峰值的80%,持續施壓。

5 網絡/線路延遲穩定性等

在一些特殊的業務場合,對延遲的容忍度極小,比如DNS解析,CDN服務,多人實時線上遊戲,高頻交易等等,需要網絡品質,尤其是不同線路(電信/聯通/教育網/...)間的差異。

二 壓測對象

明确了壓測目标後 ,就是确定要壓什麼,來實作目标。

一般來說,壓測對象可以這麼分:

如何做壓測?
  • 後端
    • 單api
    • 單業務邏輯場景
  • 前端
    • 單request
    • 單操作
    • 單頁
    • 整體頁面平均情況

三 壓測資料

壓測過程中,一般主要關注一下資料名額:

1 starter/client

如何做壓測?

最重要的三個名額:

  • qps
  • rt
  • 成功率

其他的:

  • 頁面平均響應時間 (重要)。
  • 并發量(其實沒那麼重要,主要還是qps)。
  • 最大使用者同時線上數 (使用者登入系統,一般不需要額外壓測,除非業務場景特殊)。
  • 網絡品質(延遲,波動等,不展開)。

2 server

主要是監控資料:

如何做壓測?
  • cpu usage
  • load
  • mem
  • jvm/fullGC
  • 連接配接數(netstat)
  • disk io (iostat / iotop)

四 壓測結果分析

一般是随着壓力的增加(并發請求的增加)探究qps/rt/成功率三者的關系,進而找到系統的平衡點,如果能結合服務端的監控資料,就更好。

如何做壓測?
如何做壓測?
如何做壓測?

五 壓測工具

1 jmeter

concurrent Thread Group

如何做壓測?

java sampler

如何做壓測?
如何做壓測?

composite chart

可以将多個chart組合到一個chart中,并且坐标系會自動伸縮,友善在一個圖中展示結果。

如何做壓測?

六 性能名額推算方法

以上都是一些系統向的名額資料,其實對使用者來說是不感覺,或者說也是沒有意義的。那什麼樣的數字是有意義的呢?舉個例子:

如果你提供的是一個線上的網頁服務,那使用者可能關心的是,你的系統在保證不察覺卡頓的情況下(系統的SLA, 實際可能容忍存在偶發的頁面錯誤重試)能承受多少人并發使用。

如果你提供的是個結算系統,那使用者可能關心的是,在保證交易有效性的情況下(不能出錯,但是可以偶發逾時重試,同樣是系統的SLA),每秒可以處理多少筆訂單。

舉例分析:

1 基本算法

如何做壓測?

此處pv表意不清,實為後端日志統計的後端api的調用次數,如果有前端統計的一般意義上的pv(page visit),基本原理相同,可以簡單換算一下,pv * x-ratio = 後端調用次數。

  1. 擷取現場每日asapi PV/UV的均值/峰值。
  2. 取Max(PV峰值*0.8,每日PV均值)作為目标PV', PV'時段的UV值作為實際并發使用者參考值N', 計算PV'/perMinute/N'作為每分鐘使用者操作觸發api次數O'。
  3. 根據以下規則換算成後端需要支援的qps:
  • 3.1 模型假設:2/8原則——每日有80%的PV發生在20%的工作時間内(ratio=0.8)。
  • 3.2 假設頁面單個請求映射到後端api請求比例為1:10,假設一天working hour為8小時 (e=10)。
  • 3.3 假設一般使用者,高峰期每分鐘操作頁面10次 (o=10)。
  • 3.4 根據現場日PV計算支援N'使用者并發操作需要的qps:PV' * ratio/(working hour∗60∗60∗(1−ratio) )= qps
  • 3.5 根據現場峰值小時級PV計算支援N'使用者并發操作需要的qps:PV' * ratio/(1∗60∗60∗(1−ratio) ) = qps
  1. 根據壓測qps推算能夠支援的最大使用者同時使用數:
  • 4.1 同樣基于上述公式,根據上述假設,1分鐘内,每個使用者操作10次,每次前端操作對應後端10個api:
    • 1分鐘PV = N 10 10
    • N 10 10 / 60 = qps ==> N = qps * 0.6
  • 4.2 如果按照小時為機關推算,1個小時内,每個使用者操作頁面100次,每次前端操作對應後端10個api:
    • 60分鐘PV = N 100 10
    • N 100 10 / 6060 = qps ==> N = qps 3.6

2 正向推演

如果現場環境資料表明,高峰期9:00~10:00有50人登入過系統,pv累計10000,那麼根據(3.1),系統整體qps >= 11+ 才能維持目前使用者量正常使用。

3 反向推演

如果家裡環境壓測結果表明,随機API調用qps=30, 保持上述假設,參照(4.2),即可支撐18人高峰期同時操作。

4 不嚴謹的地方

上述算法針對随機API按照1:1計算,實際上調用肯定是不均勻的,可以根據現場的資料統計下api的調用分布,壓測是模拟相同的調用分布盡量貼近實際。

另外使用者每分鐘操作頁面次數,和每次前端請求對應後端api的膨脹比都是預估出來的,雖然可以根據模型做近似,但是不如直接根據現場資料計算出來準确。

七 其他考量

  • 鍊路跟蹤能力,分析瓶頸點
    • api log
    • eagleye-traceId
如何做壓測?
  • 緩存對資料庫的影響
    • 是否需要壓到db層,要考慮壓測場景。
    • 是否需要創造海量的随機壓測資料 (比如針對單使用者的緩存優化場景,單一使用者的性能不能用來推送多使用者并發的場景)。
  • 同步接口異步接口的壓測 (staragent)
    • 主要考驗背景任務處理能力(異步任務送出即時傳回了)。
  • 系統不同層次的限流設定對API的影響
    • 比如有業務層的限流如Sentinel, Nginx層的限流如X5, 或者其他基于LVS的限流等。
  • 消息通信,尤其是廣播消息。
  • 資料庫,尤其是寫一緻性。
  • 複雜場景的長鍊路調用。
  • Nginx/Tomcat的配置對請求的影響。
  • 容易忽視的對象序列化/反序列化對性能的影響。
  • 熱點資料。