一、遇到的一些問(wèn)題
記得 2008 年做性能測(cè)試的時(shí)候,新進(jìn)7臺(tái) lenovo 4核4G 服務(wù)器用于性能測(cè)試。
當(dāng)時(shí)資源緊張,這7臺(tái)服務(wù)器都裝了雙系統(tǒng)(Win2003/CentOS5)空閑時(shí)用于做測(cè)試機(jī)(壓測(cè)的Agent)。
當(dāng)時(shí)給Nginx做了一系列測(cè)試,印象很深的是:在這批機(jī)器上,Nginx狀態(tài)頁(yè)面的壓測(cè)。
短連接的話最佳QPS約4萬(wàn),長(zhǎng)連接的話最高QPS約13萬(wàn)。
大概3年后,那批 lenovo 服務(wù)器已經(jīng)沒(méi)人瞧得上了,只能做肉雞。
然而,一次不經(jīng)意的測(cè)試,發(fā)現(xiàn)再牛的服務(wù)器,短連接最佳QPS也高不了多少。而且,測(cè)試機(jī)的資源沒(méi)用完,被測(cè)試服務(wù)器的資源也用不完,網(wǎng)絡(luò)也沒(méi)瓶頸。
服務(wù)器資源使用率很低,然而響應(yīng)就是不夠快。
最后,我們發(fā)現(xiàn)了瓶頸在監(jiān)聽(tīng)的入口!是否可以提高監(jiān)聽(tīng)入口的性能?是否可以端口復(fù)用?最后我們找到了SO_REUSEPORT。
SO_REUSEPORT支持多個(gè)進(jìn)程或者線程綁定到同一端口,提高服務(wù)器程序的性能。
二、解決方案
測(cè)試環(huán)境
查看編譯參數(shù)
Nginx 配置如下:
注意有一個(gè)reuse_port參數(shù)
壓測(cè) reuse_port
Tengine 早已支持 reuse_port 。開(kāi)啟 reuse_port 后,你會(huì)發(fā)現(xiàn)有很多進(jìn)程同時(shí)監(jiān)聽(tīng)80端口:
加壓后你會(huì)發(fā)現(xiàn),服務(wù)器性能可被你榨干:
對(duì)比一下測(cè)試 reuse_port 的效果,小伙伴們驚呆了(短連接QPS過(guò)了24萬(wàn))!
真相大白后,你還等什么?
探個(gè)究竟
測(cè)試過(guò)程中由于壓大 TCP: Possible SYN flooding on port 80. ,出大量錯(cuò)誤 。
于是將并發(fā)量降到了6萬(wàn) net.core.somaxconn = 65535 。
再關(guān)閉 reuse_port 后,我們看下 perf top的情況:
然后再打開(kāi) reuse_port ,對(duì)比 perf top 的情況:
此時(shí)再放大 Nginx 監(jiān)聽(tīng)的 back_log ,看下資源使用情況:
我們來(lái)看看些時(shí)的隊(duì)列情況(有入隊(duì)過(guò)萬(wàn)了):
然后我們?cè)賮?lái)挑戰(zhàn)30萬(wàn)并發(fā)(MTT是平均響應(yīng)時(shí)間(ms)):
經(jīng)過(guò)一系列調(diào)優(yōu),相同環(huán)境相同并發(fā)量,沒(méi)有再出現(xiàn) TCP: Possible SYN flooding on port 80.。但出現(xiàn)了少量連接超時(shí)的情況:
至此測(cè)試完畢,開(kāi)啟reuse_port確實(shí)可以讓性能提升3倍,何不試試。
【via@運(yùn)維幫】
聯(lián)系客服