在某次行銷活動前,後端團隊雖然知道即將會有比平常更多的流量,但苦於先前沒有舉辦過類似的行銷活動,也就沒有系統的歷史監控數據可以參考,因此無法提供 SRE 一個合理的數字讓他們加開虛擬機,這將使我們的服務在行銷檔期內可能無法維持高可用,甚至無法確保 SLO 的水準。
那麼我們有沒有其他方法可以計算需要加開的虛擬機數量呢?
既然沒有相似的行銷活動數據,此時我們能仰賴的就只有系統日常的已知事實,如果再搭配數學模型預測檔期間的流量,便能簡易預測要做多少準備工作了。
已知事實
從 SRE 的監控系統中可以獲得下列資訊:
- 平均每小時累計 3,000 個請求
- 每台 VM 平均負擔 2 QPS
數學模型
由於我們不曉得自己的服務的 QPS 分佈是否屬於某種已知分佈,只好先粗暴地假設在每個小時內的 QPS 服從。
預測目標
最終目標是維持服務的高可用性,即每一個服務請求都要能被虛擬機處理且沒有遺漏。這意味著我們的叢集內必須常駐著特定數量的虛擬機,才足以處理尖峰時段的流量。(舉例來說,每台虛擬機負擔 2 QPS,尖峰時段達到 11 QPS,則可以預期需要 6 台虛擬機才足以維持服務高可用)所以我們要計算的對象其實是尖峰時段的 QPS,也就是 QPS 的最大值。
綜上所述,我們可以重新整理一下此情境真正要解決的問題:
已知服務平均每小時累計 3,000 個請求,每台 VM 平均負擔 2 QPS,請假設 QPS 服從常態分佈,求 QPS 最大值為多少?VM 至多需要幾台?
推導#
根據常態分佈的特性,我們已知隨機變數 x 的機率密度函數為:
p=f(x)=σ2π1e−2σ2(x−μ)2
且函數 f(x) 曲線下面積為 1:
∫−∞∞f(x)dx=100%=1
且 x 在平均數 μ 的三倍標準差(σ)以內的 f(x) 曲線下面積約佔全面積的 99.7%:
∫μ−3σμ+3σf(x)dx=99.7%×∫−∞∞f(x)dx=99.7%×1=0.997
如果將此情況類推到我們的情境中,則隨機變數相當於時間 t,假設 t 的單位為秒,則機率密度相當於 QPS,q:
q=g(t)=σ2π1e−2σ2(t−μ)2
函數 g(t) 曲線下面積相當於總請求數量,可知 g(t) 在一小時 3600 秒的範圍內累積了 3000 個請求:
∫μ−3σμ+3σg(t)dt=3000
假設這 3600 秒恰好涵蓋 99.7% 的請求總數,則從邊界的計算可推得標準差 σ=600:
(μ+3σ)−(μ−3σ)=3600⇒σ=600
再從面積的計算可推導 g(t) 曲線下面積約為 f(x) 曲線下面積的 3009 倍:
∫−∞∞g(t)dt=0.9973000=3009=3009×∫−∞∞f(x)dx
即 g(t) 與 f(x) 為線性關係:
g(t)=3009×f(x)
而所求 QPS 最大值即為 g(x) 最大值,發生在當 t=μ 或 x=μ 時:
g(μ)=3009×f(μ)=3009×σ2π1=6002×3.143009=2
可知 VM 至多需要 2/2=1 台