第二部分:延遲監控¶
< 返回目錄 | < 上一題:告警系統設計 | 下一題:響應時間分布 >
場景:API 沒報錯,但超級卡¶
你的告警系統(Q1)上線了,這幾週都很平靜——失敗率穩定在 5% 左右。
但某天用戶抱怨:「API 沒報錯,但超級卡!明明平常 100ms 就回來,現在要等 500ms。」
這是另一種異常:延遲異常。失敗率正常,但響應時間暴增。
你查了一下系統架構,發現延遲來自兩個地方:
請求到達
│
▼
┌─────────────────────────────┐
│ 等待凑齊 batch │ ← 你的服務用批量推理來省成本
│ (第一個到的要等其他人) │ batch size = 8
└─────────────────────────────┘
│
▼
┌─────────────────────────────┐
│ 等待 GPU 空閒 │ ← 上一個 batch 還在處理
│ (排隊等待) │
└─────────────────────────────┘
│
▼
處理完成,回傳結果
問題來了:延遲飆升是「流量變大」還是「batch 設太大」?
要回答這個,你得先知道「正常情況下,凑齊一個 batch 要多久」。這就是這一章的核心問題。
第 2 題:批次等待與延遲建模¶
(a) 請求什麼時候來?¶
3 分 ・ 大二
問題:要知道「凑齊 8 個請求」要等多久,你得先知道請求是怎麼到達的。
請求不是均勻到達的——有時候一秒內來了 300 個,有時候只有 150 個。這個「隨機到達」怎麼建模?
你需要知道:建模請求到達的隨機過程
假設請求到達滿足以下條件:
- 獨立性:不同時段的到達互不影響
- 齊次性:每秒平均到達率 \(\lambda = 200\) 不變
- 稀疏性:極短時間內(如 1ms)最多到達 1 個請求
題目:
令 \(N(t)\) 為時間 \([0, t]\) 內到達的請求數。
- 推導 \(P(N(t) = k)\) 的公式
- 計算 \(E[N(t)]\) 和 \(\text{Var}(N(t))\)
- 若 \(\lambda = 200\),\(t = 1\) 秒,計算 \(P(N(1) \geq 250)\)
提示
把 \([0, t]\) 分成 \(n\) 個小區間,每個區間長度 \(t/n\)。當 \(n\) 很大時,每個小區間最多到達 1 個請求,機率約 \(\lambda t / n\)。這是 \(n\) 次 Bernoulli 試驗,成功機率 \(p = \lambda t / n\)。令 \(n \to \infty\)...
解答
-
把 \([0, t]\) 分成 \(n\) 個小區間,每個區間到達機率 \(p = \lambda t / n\)。
\(N(t) \approx B(n, \lambda t / n)\),當 \(n \to \infty\):
\[P(N(t) = k) = \lim_{n \to \infty} \binom{n}{k} \left(\frac{\lambda t}{n}\right)^k \left(1 - \frac{\lambda t}{n}\right)^{n-k} = \frac{(\lambda t)^k e^{-\lambda t}}{k!}\] -
\[E[N(t)] = \lambda t, \quad \text{Var}(N(t)) = \lambda t\]
(期望 = 變異數是這個分布的重要特徵)
-
\(\lambda t = 200\),求 \(P(N(1) \geq 250)\):
常態近似:\(N(1) \approx N(200, 200)\),\(\sigma = \sqrt{200} \approx 14.14\)
\[P(N(1) \geq 250) \approx 1 - \Phi\left(\frac{249.5 - 200}{14.14}\right) = 1 - \Phi(3.50) \approx 0.00023\]
這個計算有什麼用?
理解流量波動:即使平均 200 QPS,實際每秒的請求數會在 200 附近波動。標準差 \(\sqrt{200} \approx 14\),所以大部分時間在 \([172, 228]\) 之間。
與 batch 等待的關係:知道了「一秒內有多少請求」,接下來就能問「凑齊 8 個請求要多久」——這是 (b) 和 © 的主題。
數學小結:你剛才發現了 Poisson 分布
單位時間內的隨機到達計數,數學上叫做 Poisson 分布,記作 \(N(t) \sim \text{Pois}(\lambda t)\)。
| 性質 | 公式 |
|---|---|
| PMF | \(P(N=k) = \frac{(\lambda t)^k e^{-\lambda t}}{k!}\),\(k = 0, 1, 2, \ldots\) |
| 期望值 | \(E[N] = \lambda t\) |
| 變異數 | \(\text{Var}(N) = \lambda t\)(期望 = 變異數!) |
| 可加性 | \(\text{Pois}(\lambda_1) + \text{Pois}(\lambda_2) = \text{Pois}(\lambda_1 + \lambda_2)\) |
進階:Poisson 極限定理¶
3 分 ・ 大三
你的服務有 1000 萬個潛在用戶,每個用戶每秒發請求的機率是 \(2 \times 10^{-5}\)。 理論上,每秒請求數應該是 \(\text{Binomial}(10^7, 2 \times 10^{-5})\)。
但問題是:\(\binom{10^7}{k}\) 根本算不動!
你需要知道:有沒有更簡單的近似方法?
題目:證明 Poisson 極限定理——當 \(n \to \infty\), \(p \to 0\), \(np \to \lambda\) 時:
證明
設 \(p_n = \lambda/n\),則:
當 \(n \to \infty\):
- \(\frac{n(n-1)\cdots(n-k+1)}{n^k} \to 1\)(因為 \(k\) 固定,\(n\) 很大)
- \(\left(1 - \frac{\lambda}{n}\right)^n \to e^{-\lambda}\)(經典極限)
- \(\left(1 - \frac{\lambda}{n}\right)^{-k} \to 1\)(因為 \(k\) 固定)
這個證明有什麼用?
直接用 Poisson(200) 就好——不用算 \(\binom{10^7}{k}\) 這種天文數字。
這就是為什麼「稀有事件計數」用 Poisson:
- 用戶很多(\(n\) 大)
- 每個用戶發請求機率很小(\(p\) 小)
- 但總數是穩定的 \(\lambda = np\)
實務經驗法則:當 \(n \geq 20\) 且 \(p \leq 0.05\) 時,Binomial 就可以用 Poisson 近似。
(b) 等下一個請求要多久?¶
3 分 ・ 大二
問題:第一個請求到了,你的服務開始等待凑齊 batch。下一個請求什麼時候來?
Poisson 分布告訴你「一段時間內有幾個請求」,但這裡要問的是時間:等到下一個請求要多久?
你需要知道:從「計數」轉換到「時間」
題目:
令 \(W\) 為「等到下一個請求的時間」(即請求間隔)。
- 推導 \(W\) 的分布:\(P(W > t) = ?\)
- 計算 \(E[W]\) 和 \(\text{Var}(W)\)
- 若 \(\lambda = 200\),平均等待時間是多少?
提示
\(W > t\) 表示「時間 \([0, t]\) 內沒有請求到達」,即 \(N(t) = 0\)。
解答
-
\[P(W > t) = P(N(t) = 0) = e^{-\lambda t}\]
這是 CDF 的補函數,所以 \(W\) 的 CDF 是 \(F_{W}(t) = 1 - e^{-\lambda t}\)
PDF:\(f_{W}(t) = \lambda e^{-\lambda t}\),\(t \geq 0\)
-
\[E[W] = \frac{1}{\lambda}, \quad \text{Var}(W) = \frac{1}{\lambda^2}\]
-
\(\lambda = 200\) 時:
\[E[W] = \frac{1}{200} = 0.005 \text{ 秒} = 5 \text{ ms}\]
這個計算有什麼用?
直接應用:平均 5ms 就會有下一個請求到達。
但這只是「等 1 個」。如果 batch size = 8,第一個到的請求要等其他 7 個,那要多久?→ 這是 © 的問題。
數學小結:你剛才發現了 Exponential 分布
請求間隔(等到下一個請求)服從 Exponential 分布:\(W \sim \text{Exp}(\lambda)\)
| 性質 | 公式 |
|---|---|
| \(f(t) = \lambda e^{-\lambda t}\),\(t \geq 0\) | |
| CDF | \(F(t) = 1 - e^{-\lambda t}\) |
| 期望值 | \(E[W] = 1/\lambda\) |
| 變異數 | \(\text{Var}(W) = 1/\lambda^2\) |
| 無記憶性 | \(P(W > s+t \mid W > s) = P(W > t)\) |
© 凑齊 n 個請求要多久?¶
3 分 ・ 大二
問題:你的 batch size = 8。第一個請求到了,要等其他 7 個才能一起處理。這個等待要多久?
(b) 告訴你「等 1 個」的時間是 Exponential。那「等 n 個」呢?
你需要知道:\(n\) 個獨立 Exponential 的和
題目:
令 \(T_n = W_1 + W_2 + \cdots + W_n\),其中各 \(W_i \sim \text{Exp}(\lambda)\) 獨立。
- 計算 \(E[T_n]\) 和 \(\text{Var}(T_n)\)
- 若 \(\lambda = 200\),batch size \(n = 8\),平均等待時間是多少?
- 若 batch size \(n = 16\),平均等待時間是多少?
解答
-
由獨立性:
\[E[T_n] = n \cdot E[W] = \frac{n}{\lambda}\]\[\text{Var}(T_n) = n \cdot \text{Var}(W) = \frac{n}{\lambda^2}\] -
\(\lambda = 200\),\(n = 8\):
\[E[T_8] = \frac{8}{200} = 0.04 \text{ 秒} = 40 \text{ ms}\] -
\(\lambda = 200\),\(n = 16\):
\[E[T_{16}] = \frac{16}{200} = 0.08 \text{ 秒} = 80 \text{ ms}\]
這個計算有什麼用?
直接應用:
| batch size | 平均等待時間 |
|---|---|
| 4 | 20 ms |
| 8 | 40 ms |
| 16 | 80 ms |
batch size 越大,第一個到的請求等越久。這就是延遲和成本的 trade-off。
下一個問題:batch size 該設多少?→ 這是 (d) 的問題。
數學小結:你剛才發現了 Gamma 分布
\(n\) 個請求的總等待時間 服從 Gamma 分布:\(T_n \sim \text{Gamma}(n, \lambda)\)
| 性質 | 公式 |
|---|---|
| \(f(t) = \frac{\lambda^n t^{n-1} e^{-\lambda t}}{(n-1)!}\),\(t \geq 0\) | |
| 期望值 | \(E[T_n] = n/\lambda\) |
| 變異數 | \(\text{Var}(T_n) = n/\lambda^2\) |
| 與 Exponential 關係 | \(\text{Gamma}(n, \lambda) = \sum_{i=1}^n \text{Exp}(\lambda)\) |
進階:用 MGF 驗證 Gamma 分布¶
3 分 ・ 大三
你的同事質疑:「為什麼 \(n\) 個 Exponential 的和是 Gamma?你能證明嗎?」
你需要知道:MGF 的唯一性——分布由 MGF 唯一確定
題目:
- 推導 \(\text{Exponential}(\lambda)\) 的 MGF:\(M_X(t) = ?\)
- 設 \(S = X_1 + \cdots + X_n\),其中 \(X_i \stackrel{iid}{\sim} \text{Exp}(\lambda)\),求 \(M_S(t)\)
- 驗證這是 \(\text{Gamma}(n, \lambda)\) 的 MGF
提示
MGF 定義:\(M_X(t) = E[e^{tX}]\)。對 Exponential 分布,這是一個可積分的指數積分。
解答
Step 1:Exponential 的 MGF
當 \(t < \lambda\) 時,積分收斂:
Step 2:獨立和的 MGF
由於 \(X_1, \ldots, X_n\) 獨立,MGF 相乘:
Step 3:Gamma 的 MGF
\(\text{Gamma}(n, \lambda)\) 的 MGF 正是 \(\left(\frac{\lambda}{\lambda - t}\right)^n\),與上式相同。
由 MGF 唯一性定理,\(S \sim \text{Gamma}(n, \lambda)\)。\(\square\)
這個技巧有什麼用?
考試必備:MGF 是證明「和的分布」的標準工具。
| 原分布 | 和的分布 | MGF 相乘後 |
|---|---|---|
| \(n\) 個 \(\text{Exp}(\lambda)\) | \(\text{Gamma}(n, \lambda)\) | \(\left(\frac{\lambda}{\lambda-t}\right)^n\) |
| \(n\) 個 \(N(\mu, \sigma^2)\) | \(N(n\mu, n\sigma^2)\) | \(e^{n\mu t + n\sigma^2 t^2/2}\) |
| \(n\) 個 \(\text{Pois}(\mu)\) | \(\text{Pois}(n\mu)\) | \(e^{n\mu(e^t - 1)}\) |
比直接算卷積積分簡單得多!
(d) Batch Size 決策¶
3 分 ・ 大二
回到最初的問題:batch size 該設多少?
© 告訴你「凑齊 \(n\) 個請求」的平均等待時間是 \(n/\lambda\)。但用戶的容忍度是有限的——等太久會抱怨。
你需要知道:給定容忍度,batch size 最大能設多少?
題目:
假設 \(\lambda = 200\) QPS,用戶最多容忍 50 ms 的等待。
- 用期望值估計:batch size 最大設多少?
- 用「95% 的請求在 X ms 內」:需要用 Gamma 的分位數(給定 \(P(T_n > t_{0.95}) = 0.05\))
解答
-
用期望值估計:
\(E[T_n] = n/\lambda \leq 0.05\) 秒
\(n \leq 0.05 \times 200 = 10\)
所以 batch size 最大設 10。
-
用 95% 分位數:
這需要查 Gamma 分布表或數值計算。
對 \(\text{Gamma}(n, \lambda)\),找 \(t\) 使得 \(P(T_n \leq t) = 0.95\)。
實務上,如果要求「95% 的請求等待不超過 50ms」,batch size 要設得更小(約 6-8)。
這個計算有什麼用?
直接應用:決策表
| 容忍度 | 決策(λ=200) |
|---|---|
| E[等待] ≤ 50ms | batch ≤ 10 |
| P95 ≤ 50ms | batch ≤ 7 |
| P99 ≤ 50ms | batch ≤ 5 |
Trade-off:
- batch 越大 → GPU 利用率越高,成本越低
- batch 越小 → 等待時間越短,用戶體驗越好
這就是工程決策的本質:用數學量化 trade-off。
進階:如果處理也要排隊?¶
前面我們只考慮「凑齊 batch」的等待。但真實系統還有另一層延遲:GPU 正在處理上一個 batch,新請求要排隊。
這就需要排隊論了。
排隊延遲:M/M/1 模型¶
4 分 ・ 碩一
問題:凑齊 batch 只是第一步。如果 GPU 正在處理上一個 batch,還要排隊等待。
這個「排隊等待」怎麼建模?
題目:
建立 M/M/1 排隊模型: - 到達過程:Poisson,rate \(\lambda\) - 服務時間:Exponential,rate \(\mu\)(平均服務時間 \(1/\mu\))
- 定義利用率 \(\rho = \lambda / \mu\)。說明穩態存在的條件
- 推導穩態下系統中顧客數 \(L\) 的分布:\(P(L = k)\)
- 計算 \(E[L]\) 和平均等待時間 \(W\)(使用 Little's Law)
- 若 \(\lambda = 200\),\(\mu = 250\),計算 \(\rho\)、\(E[L]\) 和 \(W\)
解答
-
穩態條件:\(\rho = \lambda / \mu < 1\)
若 \(\rho \geq 1\),到達率 ≥ 服務率,隊列會無限增長。
-
穩態分布:
\[P(L = k) = (1 - \rho) \rho^k, \quad k = 0, 1, 2, \ldots\]這是 Geometric 分布!
-
期望隊列長度:
\[E[L] = \sum_{k=0}^{\infty} k (1-\rho) \rho^k = \frac{\rho}{1 - \rho}\]Little's Law:\(E[L] = \lambda \cdot W\)
\[W = \frac{E[L]}{\lambda} = \frac{\rho}{\lambda(1-\rho)} = \frac{1}{\mu - \lambda}\] -
\(\lambda = 200\),\(\mu = 250\):
\(\rho = 200/250 = 0.8\)
\(E[L] = 0.8 / 0.2 = 4\)
\(W = 1 / (250 - 200) = 1/50 = 0.02\) 秒 = 20 ms
這個計算有什麼用?
延遲告警閾值:正常情況下平均等待 20ms。如果監控到等待時間持續超過這個值,可能代表:
- 流量增加:\(\lambda\) 上升,\(\rho\) 接近 1
- 服務變慢:\(\mu\) 下降,可能是 GPU 出問題
這就是延遲告警的數學基礎。
容量監控:什麼時候會爆掉?¶
3 分 ・ 大三
M/M/1 的延伸問題:利用率 \(\rho\) 接近 1 時會發生什麼?
當利用率 \(\rho = \lambda / \mu\) 接近 1 時,隊列會無限增長,延遲會趨向無限大——這就是「過載」。
題目:
- 當 \(\rho \to 1^-\) 時,\(E[L]\) 和 \(W\) 如何變化?
- 若要求平均等待時間 \(W \leq 50\) ms,\(\lambda = 200\),\(\mu\) 至少要多少?
- 說明「80% 利用率」法則的數學原因
解答
-
當 \(\rho \to 1^-\):
\[E[L] = \frac{\rho}{1-\rho} \to \infty$$ $$W = \frac{1}{\mu - \lambda} \to \infty\]系統會「爆掉」——隊列無限增長,延遲無限大。
-
\(W \leq 0.05\) 秒:
\[\frac{1}{\mu - 200} \leq 0.05 \Rightarrow \mu - 200 \geq 20 \Rightarrow \mu \geq 220\]服務率至少要 220 QPS(比到達率高 10%)。
-
80% 利用率法則:
\(\rho = 0.8\) 時,\(E[L] = 4\),\(W = 4/\lambda\)
\(\rho = 0.9\) 時,\(E[L] = 9\),\(W = 9/\lambda\)
\(\rho = 0.95\) 時,\(E[L] = 19\),\(W = 19/\lambda\)
結論:利用率從 80% 升到 95%,延遲增加近 5 倍!所以生產系統通常保持 \(\rho \leq 0.8\)。
這個計算有什麼用?
容量規劃:如果預期流量 \(\lambda = 200\),服務能力不能剛好 200——需要留餘裕。
業界經驗:\(\mu \geq 1.25 \lambda\)(即 \(\rho \leq 0.8\))是安全的設計。
第 2 題小結:從痛點到決策¶
Q1 → Q2 的連結¶
| Q1 | Q2 | |
|---|---|---|
| 監控什麼 | 失敗率 | 延遲 |
| 異常類型 | 「錯太多」 | 「太慢」 |
| 決策 | 告警閾值 | batch size |
| 工具 | Binomial | Poisson → Gamma |
本章的決策流程¶
「凑齊 batch 要多久?」
│
├─► (a) 請求到達:Poisson 分布
│ → λ=200 QPS,流量波動 ±14
│
├─► (b) 等下一個:Exponential 分布
│ → 平均 5ms 就有下一個請求
│
├─► (c) 等 n 個:Gamma 分布
│ → batch=8 時平均等 40ms
│
└─► (d) 決策:batch size 設多少?
→ 容忍 50ms 等待 → batch ≤ 10
分布關係圖¶
Q2 → Q3 的連結¶
Q2 講的是「凑 batch 的等待」和「排隊的等待」。
但用戶關心的是總延遲 = 排隊 + 處理。處理時間不是固定的——輸出越長,處理越久。
這是 Q3 的主題:響應時間分布。