IT 運維:站點可靠性 即時模型

你是一項 Web 服務的值班工程師:負載均衡器後面是一組實例,緩存放在數據庫前面,可用性目標是 99.9 %。模型每分鐘用教科書公式計算排隊延遲、超時、緩存命中和數據庫負載,以及你的決策要花多少錢。

你會學到甚麼

模擬器

時間 0 min
請求數 1125 · 錯誤率 0.00% · p99 延遲 342 ms · 提供服務的實例 10 (+0) · 緩存命中率 77% · 數據庫使用率 19% · 剩餘錯誤預算(30 天) 50.0%⇉1125 請求/秒▶▶▶▶▶▶▶▶▶▶······························▶ 10 · ⚙ 0 · 52% · p99 342 ms集羣使用率 52%緩存命中率 77%數據庫使用率 19%⚠ 0.00% · 🔥 0.0×50%$ 4.00/h · Σ $0.00
  • 正在提供服務的實例
  • 正在啓動的實例
  • 運行問題構建的實例
  • 空閒位置
  • 傳入請求

控制項

實例集羣的下限。調高會立即啓動實例,但它們仍要等啓動延遲過去才能提供服務。

按使用率目標跟蹤;實例還在啓動時不會再次擴容。關閉 = 恰好保持最小實例數。

越低 = 餘量越大,成本也越高。測得的使用率不會超過 100 %,所以已飽和的集羣只能一步一步增長。

TTL 越長 = 命中越多,但返回的答案可能越舊(平均時齡 ≈ TTL/2)。

加載熱點鍵 6 分鐘(每分鐘填充緩存的 12 %),代價是每秒額外 600 次數據庫查詢。

佔 30 % 的低優先級流量(預取、批處理、爬蟲)中,在負載均衡器處以“請稍後重試”拒絕的比例。

這個重量級功能讓每個請求多耗 20 ms CPU,並多一次數據庫查詢。關閉 = 優雅降級。

在一組全新的實例上重新部署上一個良好版本(5 分鐘,收費兩次),然後切換流量。再按一次會重新開始準備;如果線上沒有有問題的版本,這樣做只會白白花錢。

指標

錯誤率
0.00%
正常
p99 延遲
342ms
正常
剩餘錯誤預算(30 天)
50.0%
正常
集羣使用率
52%
正常
燃燒速率(1 小時)0.0 ×
請求數1125 req/s
提供服務的實例10
正在啓動的實例0
緩存命中率77 %
數據庫使用率19 %
被丟棄的流量0 %
集羣成本4.00 $/h
迄今成本0.00 $
緩存答案的平均時齡30 s
問題版本上的流量0 %
推薦功能可用100 %

趨勢

錯誤率: — %20.000.00

危機情景

第 1 級 · 有問題的發佈

09:10 發佈了一個新構建。這個月已經很艱難:錯誤預算只剩 20 %。部署幾分鐘後,燃燒速率告警響了。保護好預算。

  • 結束時剩餘錯誤預算 ≥ 18.5 %
  • 部署後平均錯誤率 ≤ 0.65 %
  • 集羣成本 ≤ $9.50

第 2 級 · 突發人潮

一個指向該服務的連結正在迅速傳開,預計今早某個時候會出現流量激增——沒人知道是何時,也不知道會有多大。目前新實例需要 8 分鐘才能啓動。流量來臨時,要讓錯誤率和延遲保持低水平,同時不要為閒置的容量浪費金錢。

  • 平均錯誤率 ≤ 0.2 %
  • 平均 p99 延遲 ≤ 400 ms
  • 平均丟棄流量 ≤ 5 %
  • 總成本 ≤ $21
  • 推薦功能可用時間 ≥ 85 %

第 3 級 · 冷緩存

中午高峯時,一個維護腳本清空了整個緩存。現在每個請求都落到數據庫上,而數據庫是按平時 85 % 的命中率設計的。要讓服務恢復,又不能壓垮數據庫。

  • 平均錯誤率 ≤ 1.5 %
  • 第一分鐘之後數據庫使用率始終不高於 90 %
  • 緩存答案平均時齡 ≤ 90 秒
  • 總成本 ≤ $9
  • 推薦功能可用時間 ≥ 80 %
  • 平均丟棄流量 ≤ 5 %

依據:數字背後的模型

模擬器使用的每一個關係式及其來源。標示為假設的常數是示意校準值。

請求遵循日流量曲線加上擾動;每分鐘的數量是隨機的(泊松分佈,正態近似),並帶有少量突發性。
λ(t) = base × (1 + 0.25·sin(2π(t + clock − 6 h)/24 h)) × surge(t), clock = time of day at the start (peak at 12:00); count/min ≈ N(60λ, √(60λ)) × (1 + N(0, 0.02))[6]假設:工作進程數、服務時間、數據庫容量、緩存大小、回填速度、價格以及問題版本的錯誤率,均為中型 Web 服務的示意值。
Erlang C:在 M/M/N 系統中,請求必須等待空閒工作進程的概率。
N = instances × 16 workers, a = λ·S; C(a, N) = B / (1 − (a/N)(1 − B)), B = Erlang B[3][6]
等待時間的尾部:等待超過 t 的概率呈指數下降;等到 2 秒超時仍未得到服務的請求會失敗。超出容量的部分直接失敗。
P(W > t) = C·e^(−(N/S − λ)·t); timeouts = P(W > 2 s); a ≥ N ⇒ failed share = 1 − N/a[3]
由服務時間和等待時間分位數得出的 p99 延遲。
p99 ≈ S·ln 100 + ln(C/0.01)/(N/S − λ) (service + waiting quantile, an approximation)[3][6]近似:把服務時間分位數和等候時間分位數相加,並不是兩者總和的精確 p99(可能略高或略低);由於請求只需幾毫秒,每一分鐘內把隊列視為穩態。
利特爾法則:忙碌的工作進程數 = 到達率 × 服務時間。
busy workers L = λ·S ⇒ utilization = λ·S / N[4]
TTL 緩存:請求隨機到達時,每次未命中會開啓一個 TTL 週期,週期內的請求都會命中。
hit = warm × rT/(1 + rT), r = λ / 20,000 objects; mean age of a cached answer ≈ T/2[5]
緩存未命中會給數據庫增加負載;它的排隊延遲會拖慢每個訪問它的請求,也會佔滿應用工作進程。
DB load = λ·q·(1 − hit); query time = 5 ms/(1 − ρ_db) (≤ 250 ms); S = S_app + (1 − hit)·q·query time[6]假設:工作進程數、服務時間、數據庫容量、緩存大小、回填速度、價格以及問題版本的錯誤率,均為中型 Web 服務的示意值。
SLO 與錯誤預算:燃燒速率表示預算的消耗速度是允許速度的多少倍。
budget = 1 − SLO = 0.1 %; burn = error rate / 0.1 %; Δbudget per min = burn / 43,200; burn (1 h) = mean error rate over the last 60 min / 0.1 % (window pre-filled with the opening minute)[1][2]
帶啓動延遲和冷卻時間的目標跟蹤自動擴縮容器。
desired = ⌈serving × utilization / target⌉ (utilization saturates at 100 %); new instances serve after the boot delay[6]假設:工作進程數、服務時間、數據庫容量、緩存大小、回填速度、價格以及問題版本的錯誤率,均為中型 Web 服務的示意值。
模型使用的其他運行常數。
16 workers/instance · app time 50 ms (+20 ms and +1 query with the feature on) · 2 queries/request · DB 4,000 queries/s · 20,000 hot objects · cache refill τ = 30 min (slower while the DB is saturated) · warm-up job +12 %/min for 6 min, +600 queries/s · timeout 2 s · 30 % low-priority traffic · bad build +5 % errors, ×1.25 CPU · rollback 5 min · $0.40 per instance-hour · scale-in by ≤ 20 % of the fleet after 10 quiet minutes · up to 40 instances假設:工作進程數、服務時間、數據庫容量、緩存大小、回填速度、價格以及問題版本的錯誤率,均為中型 Web 服務的示意值。

隨機性:帶種子的 mulberry32 產生器;所用分布包括均勻分布、指數分布(反 CDF)、常態分布(Box–Muller)及泊松分布(Knuth)。種子會顯示出來,並可分享。

來源

  1. Site Reliability Engineering — Ch. 3 Embracing Risk (error budgets), Ch. 4 Service Level Objectives — Beyer, Jones, Petoff, Murphy (eds.), O'Reilly, 2016
  2. The Site Reliability Workbook — Ch. 5 Alerting on SLOs (burn rate; 14.4× over 1 h = 2 % of a 30-day budget) — Beyer, Murphy, Rensin, Kawahara, Thorne (eds.), O'Reilly, 2018
  3. Teletraffic Engineering Handbook — Erlang C formula; waiting-time distribution for M/M/n, FCFS — ITU-D Study Group 2 Question 16/2 (V. B. Iversen), 2005
  4. J. D. C. Little — A Proof for the Queuing Formula: L = λW — Operations Research 9(3):383–387, 1961
  5. J. Jung, A. W. Berger, H. Balakrishnan — Modeling TTL-based Internet Caches — IEEE INFOCOM 2003, 2003
  6. M. Harchol-Balter — Performance Modeling and Design of Computer Systems: Queueing Theory in Action (M/M/k, server farms, capacity provisioning) — Cambridge University Press, 2013

誰在從事這份工作

教育模型,不可用於實際營運決策。真實場地會按自己的設備及數據校準每一個常數。