天天看點

服務響應時間與分布(p99名額)

分析服務響應時間分布,如:均值、中位值、P95值、P99值等如何計算

平均值

我們考察一個伺服器的性能,除了QPS資料外,還會考察響應時間,當伺服器負載增高時,往往會伴随着響應時間的增長,但是這個值該如何度量,以精準的表現伺服器目前之負載呢?

最常用的值為平均值,表示服務的平均響應時間,通過該值我們能夠知道服務目前響應的所有請求耗時的平均值。 例如平均耗時為100ms,表示伺服器目前​

​請求的總耗時/請求總數量​

​,通過該值,我們大體能知道服務運作情況。 但是對于具體有多少個請求的耗時比100ms要大,大多少,是200ms,還是500ms,還是1000ms,我們無從得知。 而且,平均值這個資料容易掩蓋一些異常值問題,比如,我的财富加馬雲财富的平均值也能過億,是以,平均值這個資料項過于簡單,提供的資訊量太少。

那為什麼我們通常采用平均值來衡量或者監控服務性能呢?

主要是由于該值容易計算。

中位值

如上所述,由于平均值不能反映資料分布及極端異常值的問題,可以考慮采用中位值來作為度量。

中位值如何計算?

我們假設某服務在1s内響應了100個請求,耗時為X1、X2 ... X100,可以對這100個數按照從小到大的順序進行排序,在排序後的清單的中間位置的值——即為中位值,假設為150ms。

那這個值,150ms,表示什麼意思呢? 它表示,伺服器響應的這100個請求裡面有50個的請求耗時小于150ms,另有50個請求的耗時大于150ms。

如果,我們有一個服務qps為3萬/s,經過計算響應耗時中位值為100ms,那麼我們可以推斷有1.5萬個請求的耗時小于100ms,也就是說我們有一半的使用者的響應耗時小于100ms,據此我們就可以評估服務響應性能是否可以滿足業務要求。

但是,這個中位值還有另外一個問題,我們隻知道還有一半的請求耗時大于100ms,具體是大多少,大200ms,還是500ms,我們無法得知。

P95值與P99值

由于中位值隻能反映中位數的問題,不能回報更多資訊,例如,我想知道該服務80%的請求耗時在多少ms以内,這些問題需要額外的資料名額。

P95——響應耗時從小到大排列,順序處于95%位置的值即為P95值。

還是采用上面那個例子,100個請求按照響應時間從小到大排列,位置為95的值,即為P95值。 我們假設該值為180ms,那這個值又表示什麼意思呢?

意思是說,我們對95%的使用者的響應耗時在180ms之内,隻有5%的使用者的響應耗時大于180ms,據此,我們掌握了更精确的服務響應耗時資訊。

P99.9值

亞馬遜經常采用P99.9值,也就是99.9%使用者耗時作為名額,也就是1000個使用者裡面,999個使用者的耗時上限,如果測量與優化該值,即可保證絕大多數使用者的使用體驗。 至于P99.99值,優化成本過高,而且服務響應由于網絡波動、系統抖動等不能解決之情況,故暫不考慮該名額。

如何計算P分位值

如上說過平均值的計算方式,而P值需要将響應耗時從小到大排序,然後取得對應百分位之值。

如果服務qps較低,例如:100/秒,記錄這100個耗時資料,然後排序,然後取得P分位值,倒不是難事。 而如果qps較高,例如:30萬/秒,如果還是采用​

​記錄+排序​

​的方式,可以預見需要消耗大量記憶體與計算資源。

有沒有簡單的計算方式呢?

可以采用直方圖來進行計算,該計算方式雖不是完全準确值,但精度非常高,誤差較小。

直方圖需要界定兩個直方之間的跨度,一般采用等分形式,例如對于耗時統計需求,我們可以假定一個耗時上界,然後等分,比如劃分成100個區間,對于每個響應耗時落入對應的直方,如下圖:

服務響應時間與分布(p99名額)

這樣就避免了對全部資料進行排序,隻需要根據各個直方中的資料數量,即可計算出95%位置位于哪個直方,然後在該直方内部采用插值方法,計算出P95值。

繼續閱讀