如何為監控資料計算百分位數?
介紹
監控線上系統,特別是資料密集型系統,對於持續健康檢查、分析和檢測停機時間以及提高效能至關重要。基於百分位數的方法是一種非常有效的衡量此類系統行為的技術。讓我們看看這種方法。
一般複習
什麼是百分位數,為什麼它們有用?
在統計學中,表示特定組觀察值低於該值的數值稱為百分位數或百分點。例如,對於一名學生,如果他/她的分數為 90 百分位,則表示 90% 的學生得分低於他/她。另一個例子可以是,如果 HTTP 請求的響應時間為 90 百分位,則表示 90% 的響應值低於它。
第 25th 百分位數和第 75th 百分位數之間的觀察值範圍稱為四分位距
第 25th 百分位數也稱為第 1st 四分位數,第 50th 百分位數稱為第 2nd 四分位數,第 75th 百分位數稱為第 3rd 四分位數。
當我們想要了解某個值相對於其他觀察值的位置時,百分位數非常有用。這可以透過使用值的分佈圖來實現。與此相關的各種統計術語,如平均值、中位數和眾數。
計算百分位數的公式可以表示為
$$\mathrm{n\:=\:\frac{p}{100}\:x\: 𝑁}$$
其中 P = 百分位數,N = 資料集中按升序排序的值的數量,n = 固定序數。
監控資料密集型系統 – 計算百分位數
在監控任務中,我們主要使用百分位數。其他方法,如平均值方法,受異常值的影響很大。在線上系統中,收集器用於收集資料並計算資料的分位數。
一種常見的方法
在 HTTP 請求監控的情況下,請求週期可以劃分為分位數。特定分位數,例如 ( φ50 ),可以表示為一個隨機值,其機率不能超過 50%。假設 HTTP 請求的資料流包含 n 個元素,那麼我們需要找到一個具有 φ 𝑥 𝑛 個元素的元素,其大小可能非常大,例如 1GB。
對此的解決方案是計算資料流的近似分位數。在這種方法中,整個資料流被壓縮成一組段。每個段都有固定的寬度 ( 𝑤 ) 和每個段的長度 ( l )
即時捕獲資料的百分位數 −
例如,假設我們希望在特定時間點將 1000 個值儲存在記憶體中。
讓我們選擇大小 k = 100,以及 1 毫秒的最小寬度(解析度)。
第一個值區間位於 0 到 1 毫秒之間 ( w = 1 毫秒)
並且,
第二個區間 − 1 到 3 毫秒(寬度 = 2 毫秒)
第三個區間 − 3 到 7 毫秒(寬度 = 4 毫秒)
直到第 10th 個區間 − 511 到 1023 毫秒(寬度 = 512 毫秒)
計算
為我們的響應時間建立區間(例如,0 到 100 毫秒、100 毫秒到 200 毫秒、200 毫秒到 400 毫秒...)
計算有多少響應以及每個區間中的響應數量。
將區間計數器相加,直到總和超過總響應的 n%,以計算第 n 個百分位數。
Python 中的虛擬碼片段
示例
def increment(millis): i = index(millis) if i < len(_limits): _counts[i] += 1 _total+=1; def estimate_percentile(percentile): if percentile < 0.0 or percentile > 100.0 : print("percentile must be between 0.0 and 100.0, was " + percentile) return "Error" if percentile - p.get_percentage() <= 0.0001): return get_limit()
結論
效能監控和健康檢查是當今每個資料密集型應用程式的關鍵。基於百分位數的方法在這一領域取得了豐碩成果,並已被證明是當前場景中的有用工具