性能重要衡量指標-百分位數(shù)

在性能監(jiān)控中什么是最好的度量—平均數(shù)還是百分位數(shù)?
百分位數(shù)和平均值是用于描述數(shù)據(jù)集中趨勢和分布的統(tǒng)計量,它們之間的主要區(qū)別在于:
1.平均值(均值):
?平均值是數(shù)據(jù)集中所有數(shù)值的總和除以數(shù)據(jù)點的數(shù)量。?平均值對數(shù)據(jù)集中所有數(shù)據(jù)點進行了平均處理,反映了數(shù)據(jù)的集中趨勢。?平均值容易受到極端值(異常值)的影響,因為它是所有數(shù)據(jù)點的總和除以數(shù)量。
2.百分位數(shù):
?百分位數(shù)是將數(shù)據(jù)集按大小排序后,處于特定百分比位置的數(shù)值。?例如,第50百分位數(shù)是數(shù)據(jù)集的中位數(shù),表示有50%的數(shù)據(jù)小于或等于這個值,50%的數(shù)據(jù)大于或等于這個值。?百分位數(shù)可以幫助了解數(shù)據(jù)的分布情況,識別數(shù)據(jù)集中不同位置的值。
總結(jié):
?平均值是數(shù)據(jù)集的總體平均,反映數(shù)據(jù)的集中趨勢,易受異常值影響。?百分位數(shù)表示數(shù)據(jù)集中處于特定百分比位置的值,有助于了解數(shù)據(jù)的分布情況,不受異常值的影響。
如果將一組數(shù)據(jù)從小到大排序,并計算相應的累計百分位,則某一百分位所對應數(shù)據(jù)的值就稱為這一百分位的百分位數(shù)??杀硎緸椋阂唤Mn個觀測值按數(shù)值大小排列。如,處于p%位置的值稱第p百分位數(shù)
用我們軟件開發(fā)行業(yè)的例子通俗來講就是,假設(shè)有100個請求,按照響應時間從小到大排列,位置為X的值,即為PX值。
P1就是響應時間最小的請求,P10就是排名第十的請求,P100就是響應時間最長的請求。
在真正使用過程中,最常用的主要有P50(中位數(shù))、P95、P99。
P50: 即中位數(shù)值。100個請求按照響應時間從小到大排列,位置為50的值,即為P50值。如果響應時間的P50值為200ms,代表我們有半數(shù)的用戶響應耗時在200ms之內(nèi),有半數(shù)的用戶響應耗時大于200ms。如果你覺得中位數(shù)值不夠精確,那么可以使用P95和P99.9
P95:響應耗時從小到大排列,順序處于95%位置的值即為P95值。
還是采用上面那個例子,100個請求按照響應時間從小到大排列,位置為95的值,即為P95值。我們假設(shè)該值為200ms,那這個值又表示什么意思呢?
意思是說,我們對95%的用戶的響應耗時在200ms之內(nèi),只有5%的用戶的響應耗時大于200ms,據(jù)此,我們掌握了更精確的服務響應耗時信息。
P99.9:許多大型的互聯(lián)網(wǎng)公司會采用P99.9值,也就是99.9%用戶耗時作為指標,意思就是1000個用戶里面,999個用戶的耗時上限,通過測量與優(yōu)化該值,就可保證絕大多數(shù)用戶的使用體驗。至于P99.99值,優(yōu)化成本過高,而且服務響應由于網(wǎng)絡波動、系統(tǒng)抖動等不能解決之情況,因此大多數(shù)時候都不考慮該指標。
在JavaScript中計算百分位數(shù)可以通過不同的方法實現(xiàn)。以下是一種常見的方法,使用JavaScript來計算給定數(shù)組的百分位數(shù):
// 計算數(shù)組的百分位數(shù)function percentile(arr, p) {if (arr.length === 0) {return null;}arr.sort(function(a, b) {return a - b;});var index = (p/100) * (arr.length - 1);var lower = Math.floor(index);var upper = Math.ceil(index);if (lower === upper) {return arr[lower];}var lowerValue = arr[lower];var upperValue = arr[upper];return lowerValue + (upperValue - lowerValue) * (index - lower);}// 示例用法var data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];var p = 75; // 想要計算的百分位數(shù),比如第75百分位數(shù)var result = percentile(data, p);console.log("第" + p + "百分位數(shù)為: " + result);
在這個示例中,percentile 函數(shù)接受一個數(shù)組和一個百分位數(shù)作為參數(shù),并返回該數(shù)組的對應百分位數(shù)的值。這個函數(shù)首先對數(shù)組進行排序,然后根據(jù)給定的百分位數(shù)計算相應的值。
