QPS 預測

在某次行銷活動前,後端團隊雖然知道即將會有比平常更多的流量,但苦於先前沒有舉辦過類似的行銷活動,也就沒有系統的歷史監控數據可以參考,因此無法提供 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 至多需要幾台?

推導

#

根據常態分佈的特性,我們已知隨機變數 xx 的機率密度函數為:

p=f(x)=1σ2πe(xμ)22σ2p = f(x) = \frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{(x-\mu)^2}{2\sigma^2}}

且函數 f(x)f(x) 曲線下面積為 11

f(x)dx=100%=1\int_{-\infin}^{\infin}f(x)dx = 100\% = 1

xx 在平均數 μ\mu 的三倍標準差(σ\sigma)以內的 f(x)f(x) 曲線下面積約佔全面積的 99.7%:

μ3σμ+3σf(x)dx=99.7%×f(x)dx=99.7%×1=0.997\int_{\mu-3\sigma}^{\mu+3\sigma}f(x)dx = 99.7\%\times\int_{-\infin}^{\infin}f(x)dx = 99.7\%\times 1 = 0.997

如果將此情況類推到我們的情境中,則隨機變數相當於時間 tt,假設 tt 的單位為秒,則機率密度相當於 QPS,qq

q=g(t)=1σ2πe(tμ)22σ2q = g(t) = \frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{(t-\mu)^2}{2\sigma^2}}

函數 g(t)g(t) 曲線下面積相當於總請求數量,可知 g(t)g(t) 在一小時 3600 秒的範圍內累積了 3000 個請求:

μ3σμ+3σg(t)dt=3000\int_{\mu-3\sigma}^{\mu+3\sigma}g(t)dt = 3000

假設這 3600 秒恰好涵蓋 99.7% 的請求總數,則從邊界的計算可推得標準差 σ=600\sigma = 600

(μ+3σ)(μ3σ)=3600σ=600(\mu+3\sigma) - (\mu-3\sigma) = 3600\Rightarrow \sigma = 600

再從面積的計算可推導 g(t)g(t) 曲線下面積約為 f(x)f(x) 曲線下面積的 3009 倍:

g(t)dt=30000.997=3009=3009×f(x)dx\int_{-\infin}^{\infin}g(t)dt = \frac{3000}{0.997} = 3009 = 3009\times\int_{-\infin}^{\infin}f(x)dx

g(t)g(t)f(x)f(x) 為線性關係:

g(t)=3009×f(x)g(t) = 3009 \times f(x)

而所求 QPS 最大值即為 g(x)g(x) 最大值,發生在當 t=μt = \mux=μx = \mu 時:

g(μ)=3009×f(μ)=3009×1σ2π=30096002×3.14=2g(\mu) = 3009 \times f(\mu) = 3009 \times \frac{1}{\sigma\sqrt{2\pi}} = \frac{3009}{600\sqrt{2\times3.14}} = 2

可知 VM 至多需要 2/2=12 / 2 = 1