背景
最近為了提升接口qps,想了很多辦法,當(dāng)接口在單機上qps已經(jīng)達到了極限,很容易想到的就是部署多個api,通過nginx去轉(zhuǎn)發(fā),達到qps翻倍的目的。
但是qps真的能翻倍嗎?我用nginx掛兩個api,測試了多個接口,發(fā)現(xiàn)有的能翻倍,有的qps只能多20%,有的qps甚至下降了。
注意:對nginx的優(yōu)化不在此實驗范疇
實驗?zāi)康?/p>
驗證nginx掛兩個api,aps是否真的能翻倍
下面是測試機器以及應(yīng)用部署情況
內(nèi)網(wǎng)8核16g(放wrk)
內(nèi)網(wǎng)8核16g(放nginx)
內(nèi)網(wǎng)8核16g (放api1)
內(nèi)網(wǎng)8核心16g(放api2)
測試工具
wrk
測試腳本

備注:第一個和第二個是單獨對兩個api的測試。第三個是對nginx機器分發(fā)兩臺api的測試
test-nginx.lua

nginx配置

測試代碼

請求示例
{"sleep":100}
返回示例
{"code":"200","msg":"OK","body":"test nginx"}
接口說明:接口啥都沒做,就是傳入一個sleep參數(shù),然后程序就sleep多長時間。目的是為了通過slepp參數(shù)能穩(wěn)定控制住接口的qps。所以本次實驗變量就是單個接扣qps,然后討論接扣qps與nginx掛多個api是否能做到qps翻倍的問題。
實驗結(jié)果

實驗結(jié)果分析
1.首先看1,2,3,4實驗,當(dāng)參數(shù)相同的時候,api1和api2的qps是一致的,說明兩臺機器上的api比較穩(wěn)定。
2.對比1,2號實驗,發(fā)現(xiàn)當(dāng)api的qps不高時,nginx轉(zhuǎn)發(fā)兩臺qps翻倍了。
3.查看3號實驗,單個qps是9000多,理論上轉(zhuǎn)發(fā)兩個是18000,但是nginx轉(zhuǎn)2臺是12294.76/s。查看實驗四更離譜,單個api是18000/s,nginx轉(zhuǎn)兩臺還是 12408.13/s,這里nginx轉(zhuǎn)發(fā)兩臺api的qps甚至比單個api的性能還低。
估計在這種情況下,12000大概是nginx的瓶頸,所以api如果繼續(xù)增大qps,那么,轉(zhuǎn)發(fā)兩臺還是12000多(對nginx做優(yōu)化不在本次討論范圍)。
實驗結(jié)論
當(dāng)api比較慢的時候,qps比較低,使用nginx轉(zhuǎn)發(fā),的確能夠達到翻倍的效果。這時候瓶頸在api。
當(dāng)api很快的時候,nginx轉(zhuǎn)發(fā)不能翻倍,甚至?xí)禄驗槠款i不在api,而在于nginx或者網(wǎng)絡(luò)。(nginx轉(zhuǎn)發(fā)是多了網(wǎng)絡(luò)開銷)
所以單個接口qps到達一個平衡值,通過nginx剛好能翻倍,然后單個api的qps繼續(xù)增加,通過nginx轉(zhuǎn)發(fā)就達不到翻倍效果了。
訪問鏈路分析
首先看兩張圖
1、直接訪問api流程

2、通過nginx訪問api流程

查看上面兩張圖,有以下已知的內(nèi)容:
1.api的耗時t1兩張圖中是相等的
2.直接訪問api兩次網(wǎng)絡(luò)請求,網(wǎng)絡(luò)傳輸包中一次帶請求參數(shù)(io1),一次帶接口返回接口(io2),而訪問nginx有4個網(wǎng)絡(luò)請求,網(wǎng)絡(luò)傳輸包中兩次帶請求參數(shù)(io1,io2),兩次帶返回參數(shù)(io3,io4)。所以,通過nginx訪問的網(wǎng)絡(luò)傳輸耗時是直接訪問api的兩倍(注意:網(wǎng)絡(luò)耗時很短,這里兩倍其實并不多)
3.除了兩倍的網(wǎng)絡(luò)以外,訪問nginx還比直接訪問api多了nginx處理的耗時。(nginx性能很高,這里時間也很短)
4.總結(jié)上面2和3,就是訪問nginx比直接訪問api多了兩倍網(wǎng)絡(luò)耗時和一次nginx處理耗時。
基于上面已知條件,得出以下結(jié)論:
1.nginx掛單個api的qps肯定比單個api的qps要低。
2.當(dāng)api很慢,主要耗時在于api處理耗時,nginx多的那些時間可以忽略不計,所以這時,掛多個api能翻倍。
3.當(dāng)api處理耗時比較短,那么nginx多出來的兩次網(wǎng)絡(luò)傳輸時間和自身處理時間就不可以忽略了,就會出現(xiàn),不能翻倍,只會達到增加20%,30%這種情況。
4.當(dāng)api處理時間非常短,幾乎和nginx處理耗時相當(dāng)了,那么不管掛多少個api,都會多出那幾次的網(wǎng)絡(luò)請求耗時和nginx處理耗時,掛多個api的qps肯定也不如一個api的qps