一、問題現(xiàn)象
客戶截屏系統(tǒng)偶發(fā)報錯
后臺排查nginx后臺偶爾大量報錯
no live upstreams while connecting to upstream
在nginx服務(wù)器上nestat查看
發(fā)現(xiàn)存在大量的 TIME_WAIT狀態(tài)的連接
二、問題分析
問題表現(xiàn)在nginx與下游服務(wù)器的連接出現(xiàn)了異常,在突發(fā)流量以后由于TIME_WAIT狀態(tài)的連接過多導(dǎo)致無法創(chuàng)建足夠的連接。
為什么會有如此之多的TIME_WAIT呢?
我的分析是nginx中upstream與下游服務(wù)器之間要么是配置的短連接,要么是keepalive 的數(shù)量太少了。經(jīng)過排查發(fā)現(xiàn)upstream中并無keepalive相關(guān)的配置。
如果nginx與下游服務(wù)器連接都是短連接的話,會頻繁的創(chuàng)建和斷開連接。每次斷開連接都會導(dǎo)致連接處于TIME_WAIT一段時間才能被回收掉。
TIME_WAIT狀態(tài)的持續(xù)時間是2MSL,2MSL的是時間還是比較長的,大概幾十秒到幾分鐘。
當(dāng)流量突增的時候,會出現(xiàn)大量無法回收的連接,最終導(dǎo)致新連接無法創(chuàng)建而報錯。
如果nginx與下游服務(wù)器配置了長連接,但是upstream中keepalive很小的話也會出問題。
舉個極端的例子:
假如nginx最多可以建10000個連接,keepalive的連接數(shù)配置的是1000個,即,對空閑連接最多可以維持1000個。空閑連接的回收時間為60秒。
在第一秒突然流量高峰,瞬間建了10000個連接,抗住了壓力,沒出什么大問題。然后在接下來的60秒,幾乎沒有什么流量訪問,那么在此期間nginx會把9000個空閑連接給斷開進(jìn)行回收。但是回收中的連接會經(jīng)歷2MSL時間的TIME_WAIT。也就是說在此期間,這9000個連接是無法提供服務(wù)的。等到第61秒后,又來了一波流量高峰,需要建10000個連接才能抗住。這時就要出問題了,由于9000個連接無法有效回收,nginx只能拿出1000個連接應(yīng)對請求,新建連接失敗,后臺報錯。服務(wù)器上存在大量TIME_WAIT狀態(tài)的連接。
三、配置修改
為了解決上面的問題,對nginx做了如下的配置調(diào)整后,問題解決。
經(jīng)過若干天的觀察問題得到了解決
四、nginx的容量分析
系統(tǒng)入口的平均響應(yīng)時間大概是150毫秒
在http1.1的協(xié)議下,也就是說一個連接在1秒鐘大概可以處理6.6個請求。
1000毫秒 / 150毫秒 = 6.6
如果nginx長期維持1000個活躍連接,每秒的QPS大概能到6600
當(dāng)然流量突增的時候nginx還會新建連接,抗壓能力應(yīng)該會被6600要高。文章來源:http://www.zghlxwxcb.cn/news/detail-489752.html
這只是在理論上粗略的思考一下自己的nginx的抗壓能力。實際業(yè)務(wù)場景流量成分的差異、nginx連接的回收和復(fù)用,網(wǎng)絡(luò)擁塞情況,等等都會對nginx的性能產(chǎn)生很大的影響。文章來源地址http://www.zghlxwxcb.cn/news/detail-489752.html
到了這里,關(guān)于nginx偶發(fā)502 no live upstreams while connecting to upstream的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!