跳轉到

第二部分:延遲監控

< 返回目錄 | < 上一題:告警系統設計 | 下一題:響應時間分布 >


場景:API 沒報錯,但超級卡

你的告警系統(Q1)上線了,這幾週都很平靜——失敗率穩定在 5% 左右。

但某天用戶抱怨:「API 沒報錯,但超級卡!明明平常 100ms 就回來,現在要等 500ms。」

這是另一種異常:延遲異常。失敗率正常,但響應時間暴增。

你查了一下系統架構,發現延遲來自兩個地方:

請求到達
┌─────────────────────────────┐
│  等待凑齊 batch             │  ← 你的服務用批量推理來省成本
│  (第一個到的要等其他人)    │     batch size = 8
└─────────────────────────────┘
┌─────────────────────────────┐
│  等待 GPU 空閒              │  ← 上一個 batch 還在處理
│  (排隊等待)               │
└─────────────────────────────┘
處理完成,回傳結果

問題來了:延遲飆升是「流量變大」還是「batch 設太大」?

要回答這個,你得先知道「正常情況下,凑齊一個 batch 要多久」。這就是這一章的核心問題。


第 2 題:批次等待與延遲建模


(a) 請求什麼時候來?

3 分大二

問題:要知道「凑齊 8 個請求」要等多久,你得先知道請求是怎麼到達的

請求不是均勻到達的——有時候一秒內來了 300 個,有時候只有 150 個。這個「隨機到達」怎麼建模?

你需要知道:建模請求到達的隨機過程

假設請求到達滿足以下條件:

  1. 獨立性:不同時段的到達互不影響
  2. 齊次性:每秒平均到達率 \(\lambda = 200\) 不變
  3. 稀疏性:極短時間內(如 1ms)最多到達 1 個請求

題目

\(N(t)\) 為時間 \([0, t]\) 內到達的請求數。

  1. 推導 \(P(N(t) = k)\) 的公式
  2. 計算 \(E[N(t)]\)\(\text{Var}(N(t))\)
  3. \(\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\)...

解答
  1. \([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!}\]
  2. \[E[N(t)] = \lambda t, \quad \text{Var}(N(t)) = \lambda t\]

    (期望 = 變異數是這個分布的重要特徵)

  3. \(\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\) 時:

\[\text{Binomial}(n, p) \to \text{Pois}(\lambda)\]
證明

\(p_n = \lambda/n\),則:

\[P(S_n = k) = \binom{n}{k} \left(\frac{\lambda}{n}\right)^k \left(1 - \frac{\lambda}{n}\right)^{n-k}\]
\[= \frac{\lambda^k}{k!} \cdot \frac{n(n-1)\cdots(n-k+1)}{n^k} \cdot \left(1 - \frac{\lambda}{n}\right)^n \cdot \left(1 - \frac{\lambda}{n}\right)^{-k}\]

\(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\) 固定)
\[\therefore P(S_n = k) \to \frac{\lambda^k e^{-\lambda}}{k!} \quad \square\]
這個證明有什麼用?

直接用 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\) 為「等到下一個請求的時間」(即請求間隔)。

  1. 推導 \(W\) 的分布:\(P(W > t) = ?\)
  2. 計算 \(E[W]\)\(\text{Var}(W)\)
  3. \(\lambda = 200\),平均等待時間是多少?
提示

\(W > t\) 表示「時間 \([0, t]\) 內沒有請求到達」,即 \(N(t) = 0\)

解答
  1. \[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\)

  2. \[E[W] = \frac{1}{\lambda}, \quad \text{Var}(W) = \frac{1}{\lambda^2}\]
  3. \(\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)\)

性質 公式
PDF \(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)\) 獨立。

  1. 計算 \(E[T_n]\)\(\text{Var}(T_n)\)
  2. \(\lambda = 200\),batch size \(n = 8\),平均等待時間是多少?
  3. 若 batch size \(n = 16\),平均等待時間是多少?
解答
  1. 由獨立性:

    \[E[T_n] = n \cdot E[W] = \frac{n}{\lambda}\]
    \[\text{Var}(T_n) = n \cdot \text{Var}(W) = \frac{n}{\lambda^2}\]
  2. \(\lambda = 200\)\(n = 8\)

    \[E[T_8] = \frac{8}{200} = 0.04 \text{ 秒} = 40 \text{ ms}\]
  3. \(\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)\)

性質 公式
PDF \(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 唯一確定

題目

  1. 推導 \(\text{Exponential}(\lambda)\) 的 MGF:\(M_X(t) = ?\)
  2. \(S = X_1 + \cdots + X_n\),其中 \(X_i \stackrel{iid}{\sim} \text{Exp}(\lambda)\),求 \(M_S(t)\)
  3. 驗證這是 \(\text{Gamma}(n, \lambda)\) 的 MGF
提示

MGF 定義:\(M_X(t) = E[e^{tX}]\)。對 Exponential 分布,這是一個可積分的指數積分。

解答

Step 1:Exponential 的 MGF

\[M_X(t) = E[e^{tX}] = \int_0^\infty e^{tx} \cdot \lambda e^{-\lambda x} \, dx = \lambda \int_0^\infty e^{-(\lambda - t)x} \, dx\]

\(t < \lambda\) 時,積分收斂:

\[M_X(t) = \lambda \cdot \frac{1}{\lambda - t} = \frac{\lambda}{\lambda - t}\]

Step 2:獨立和的 MGF

由於 \(X_1, \ldots, X_n\) 獨立,MGF 相乘:

\[M_S(t) = \prod_{i=1}^n M_{X_i}(t) = \left(\frac{\lambda}{\lambda - t}\right)^n\]

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 的等待。

  1. 用期望值估計:batch size 最大設多少?
  2. 用「95% 的請求在 X ms 內」:需要用 Gamma 的分位數(給定 \(P(T_n > t_{0.95}) = 0.05\)
解答
  1. 用期望值估計

    \(E[T_n] = n/\lambda \leq 0.05\)

    \(n \leq 0.05 \times 200 = 10\)

    所以 batch size 最大設 10。

  2. 用 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\)

  1. 定義利用率 \(\rho = \lambda / \mu\)。說明穩態存在的條件
  2. 推導穩態下系統中顧客數 \(L\) 的分布:\(P(L = k)\)
  3. 計算 \(E[L]\) 和平均等待時間 \(W\)(使用 Little's Law)
  4. \(\lambda = 200\)\(\mu = 250\),計算 \(\rho\)\(E[L]\)\(W\)
解答
  1. 穩態條件\(\rho = \lambda / \mu < 1\)

    \(\rho \geq 1\),到達率 ≥ 服務率,隊列會無限增長。

  2. 穩態分布

    \[P(L = k) = (1 - \rho) \rho^k, \quad k = 0, 1, 2, \ldots\]

    這是 Geometric 分布!

  3. 期望隊列長度

    \[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}\]
  4. \(\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 時,隊列會無限增長,延遲會趨向無限大——這就是「過載」。

題目

  1. \(\rho \to 1^-\) 時,\(E[L]\)\(W\) 如何變化?
  2. 若要求平均等待時間 \(W \leq 50\) ms,\(\lambda = 200\)\(\mu\) 至少要多少?
  3. 說明「80% 利用率」法則的數學原因
解答
  1. \(\rho \to 1^-\)

    \[E[L] = \frac{\rho}{1-\rho} \to \infty$$ $$W = \frac{1}{\mu - \lambda} \to \infty\]

    系統會「爆掉」——隊列無限增長,延遲無限大。

  2. \(W \leq 0.05\) 秒:

    \[\frac{1}{\mu - 200} \leq 0.05 \Rightarrow \mu - 200 \geq 20 \Rightarrow \mu \geq 220\]

    服務率至少要 220 QPS(比到達率高 10%)。

  3. 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

分布關係圖

Poisson 過程(計數)
    │ 相鄰事件的間隔
Exponential(等待時間)
    │ n 個獨立的和
Gamma(總等待時間)

Q2 → Q3 的連結

Q2 講的是「凑 batch 的等待」和「排隊的等待」。

但用戶關心的是總延遲 = 排隊 + 處理。處理時間不是固定的——輸出越長,處理越久。

這是 Q3 的主題:響應時間分布。


< 返回目錄 | < 上一題:告警系統設計 | 下一題:響應時間分布 >