聊聊搞定系統(tǒng)設(shè)計(jì)估算的一些方法
在日常工作中,經(jīng)常會(huì)遇到一些大促場(chǎng)景,需要評(píng)估系統(tǒng)的資源是否充足,是否需要增加資源,增加多少。
在系統(tǒng)設(shè)計(jì)面試中,有時(shí)也會(huì)遇到要求做一些估算類的題目:如果需要扛 100w QPS,需要多少機(jī)器……
想要做到“準(zhǔn)確”的估算,需要對(duì)數(shù)字有一定的感覺(jué)。
第二章主要講的就是一些常用的數(shù)字。本文最后也會(huì)附加一些筆者平時(shí)積累的數(shù)字。
2 的次冪
2的次冪
英語(yǔ)里面常講 1 個(gè) Million,1 個(gè) Billion,分別是百萬(wàn)、十億的意思??梢钥吹?,以 3 個(gè) 0 為一組,層層遞進(jìn)。
千-百萬(wàn)-十億
每個(gè)程序員都要了解的延遲數(shù)字
這里有一張表格反映了一些計(jì)算機(jī)的典型操作的耗時(shí),配套的還有一個(gè)可視化網(wǎng)站,這個(gè)其實(shí)見(jiàn)得比較多了。
latency number tables
圖形化的網(wǎng)頁(yè)上可以選擇年份,數(shù)據(jù)也更準(zhǔn)確。
latency number graph
- 從中可以得出一些明顯的結(jié)論:
- 內(nèi)存比磁盤(pán)快。
- 避免 disk seek。
數(shù)據(jù)中心常常位于不同的區(qū)域,在它們之間傳送數(shù)據(jù)比較耗時(shí)。
從磁盤(pán)順序讀數(shù)據(jù)比從網(wǎng)絡(luò)順序讀數(shù)據(jù)慢。
可用性數(shù)字
工作中,我們常用幾個(gè) 9 來(lái)形容一個(gè)系統(tǒng)的可用性。100% 表示一個(gè)系統(tǒng)永遠(yuǎn)不會(huì)掛,實(shí)際中的系統(tǒng)可用性指標(biāo)大多處于 99% -100% 之間。
像一些云廠商,如 Amazon,Microsoft,Google 承諾的可用性是 3 個(gè) 9,即 99.9% 或以上,描述的是可用時(shí)間。
可用性
我的一些數(shù)字積累
- 某支付服務(wù)的支付峰值 60w QPS
- Go GC 打開(kāi)寫(xiě)屏障需要花費(fèi) 10-30us
- 內(nèi)網(wǎng)中,一次網(wǎng)絡(luò)請(qǐng)求的耗時(shí)是 ms 級(jí)別
- 萬(wàn)兆網(wǎng)卡,1.25GB/s 打滿
- 4C8G 建 10w 到 20w 的連接沒(méi)有問(wèn)題
- 因?yàn)闄C(jī)械硬盤(pán)的機(jī)械結(jié)構(gòu),隨機(jī) I/O 與順序的 I/O 性能可能相差幾百倍。固態(tài)硬盤(pán)則只有十幾倍到幾十倍之間
- twitter 工程師認(rèn)為,良好體驗(yàn)的網(wǎng)站平均響應(yīng)時(shí)間應(yīng)該在 500ms 左右,理想的時(shí)間是 200-300ms
- 平均 QPS:日平均用戶請(qǐng)求除以 4w。日平均用戶請(qǐng)求,一般來(lái)自產(chǎn)品的評(píng)估。峰值 QPS:平均 QPS 的 2~4 倍
實(shí)戰(zhàn)
本章最后有一個(gè)實(shí)戰(zhàn)的例子:評(píng)估 twitter 的 QPS 和存儲(chǔ)容量。
先給出了一些預(yù)設(shè):
- 300 個(gè) million 的月活躍用戶
- 50% 的用戶每天都使用 twitter
- 用戶平均每天發(fā)表 2 條 tweets
- 10% 的 tweets 包含多媒體
- 多媒體數(shù)據(jù)保存 5 年
下面是估算的過(guò)程:
先預(yù)估 QPS:
- DAU(每天的活躍用戶數(shù),Daily Active Users)為:300 million(總用戶數(shù)) * 50% = 150 million
- 發(fā) tweets 的平均 QPS:150 million * 2 / 24 hour / 3600 second = ~3500
- 高峰期 QPS 一般認(rèn)為是平均 QPS 的 2 倍:2 * 3500 = 7000 QPS
再來(lái)估算存儲(chǔ)容量:
假設(shè)多媒體的平均大小為 1MB,那么每天的存儲(chǔ)容量為:150 million * 2 * 10% * 1MB = 30 TB。5 年的存儲(chǔ)容量為 30 TB * 365 * 5 = 55 PB。
最后這兩個(gè)的估算過(guò)程是這樣的:
300 個(gè) million * 10%* 1MB,1 MB 其實(shí)就是 6 個(gè) 0,相當(dāng)于 million 要進(jìn)化 2 次:million -> billion -> trillion,即從 M -> G -> T,于是結(jié)果等于 300 T * 10% = 30 T。
30 TB * 365 * 5 = 30 TB * 1825 = 30 TB * 10^3 * 1.825,TB 進(jìn)化一次變成 PB,于是等于 30 * 1.825 PB = 55 PB。
一些建議
估算題的精髓在于過(guò)程,解決問(wèn)題的過(guò)程比得到一個(gè)正確的結(jié)果更重要。
粗算。面試過(guò)程中,得到一個(gè)精確結(jié)果的意義不大,沒(méi)那么多時(shí)間且沒(méi)必要。例如 99987 / 9.1 可以簡(jiǎn)化為 100,000 / 10。
寫(xiě)下過(guò)程中所做的假設(shè),方便之后參考。
寫(xiě)下單位。例如 5MB,這會(huì)在后面的估算環(huán)節(jié)用到。
經(jīng)常被問(wèn)到的估算:QPS、峰值 QPS、存儲(chǔ)容量、服務(wù)器個(gè)數(shù)……
點(diǎn)評(píng)
估算能力還是挺重要的,日常工作中也用得到。例如新增一個(gè) redis,評(píng)估一下需要多少臺(tái)機(jī)器資源……如果遇到這樣的場(chǎng)景,應(yīng)該抓住機(jī)會(huì)鍛煉一下。
本章給出的 2 的次冪表格用處挺大,要收藏下來(lái),用到的時(shí)候方便隨時(shí)查看。