我們常用QPS(Query Per Second,每秒處理請(qǐng)求數(shù))來衡量一個(gè)web應(yīng)用的吞吐率,解決每秒數(shù)萬次的高并發(fā)場(chǎng)景,這個(gè)指標(biāo)非常關(guān)鍵。

舉個(gè)栗子:假設(shè)一個(gè)業(yè)務(wù)請(qǐng)求平均為100ms,同時(shí)系統(tǒng)內(nèi)有20臺(tái)apache web服務(wù)器,MaxClients(apache的最大連接數(shù))設(shè)置為500,那么理論QPS峰值就是20*500/0.1=100000(理論與實(shí)際肯定有差異)。

這系統(tǒng)貌似理論上來說很強(qiáng)大1秒鐘處理100000個(gè)請(qǐng)求,實(shí)際當(dāng)然沒有這么理想。在高并發(fā)的實(shí)際場(chǎng)景下,機(jī)器都處于高負(fù)載的狀態(tài),在這個(gè)時(shí)候平均響應(yīng)時(shí)間會(huì)被大大增加。

就Web服務(wù)器而言,Apache打開了越多的連接進(jìn)程,CPU需要處理的上下文切換也越多,額外增加了CPU的消耗,然后就直接導(dǎo)致平均響應(yīng)時(shí)間增加。因此上述的MaxClient數(shù)目,要根據(jù)CPU、內(nèi)存等硬件因素綜合考慮,絕對(duì)不是越多越好。可以通過Apache自帶的abench來測(cè)試一下,取一個(gè)合適的值。然后,我們選擇內(nèi)存操作級(jí)別的存儲(chǔ)的Redis,在高并發(fā)的狀態(tài)下,存儲(chǔ)的響應(yīng)時(shí)間至關(guān)重要。網(wǎng)絡(luò)帶寬雖然也是一個(gè)因素,不過,這種請(qǐng)求數(shù)據(jù)包一般比較小,一般很少成為請(qǐng)求的瓶頸。負(fù)載均衡成為系統(tǒng)瓶頸的情況比較少,在這里不做討論。

那么問題來了,假設(shè)我們的系統(tǒng),在5w/s的高并發(fā)狀態(tài)下,平均響應(yīng)時(shí)間從100ms變?yōu)?50ms(實(shí)際情況,甚至更多):

20*500/0.25 = 40000 (4萬QPS)

于是,我們的系統(tǒng)剩下了4w的QPS,面對(duì)5w每秒的請(qǐng)求,中間相差了1w。

舉個(gè)例子,高速路口,1秒鐘來5部車,每秒通過5部車,高速路口運(yùn)作正常。突然,這個(gè)路口1秒鐘只能通過4部車,車流量仍然依舊,結(jié)果必定出現(xiàn)大塞車。(5條車道忽然變成4條車道的感覺)

同理,某一個(gè)秒內(nèi),20*500個(gè)可用連接進(jìn)程都在滿負(fù)荷工作中,卻仍然有1萬個(gè)新來請(qǐng)求,沒有連接進(jìn)程可用,系統(tǒng)陷入到異常狀態(tài)也是預(yù)期之內(nèi)。

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式