項目場景:
我們將服務部署到A公司服務器中,使用了共五臺服務器,分別是:1.NG服務器 2.日志服務器 3.緩存服務器 4.應用服務器1 5.應用服務器2 。而請求過來首先到達的是他們的物理代理服務器,然后再轉發請求到我們的ng服務器,然后再到應用服務器。
問題描述
接口請求經常會網絡繁忙,報504 Gateway Time-out,然后返回了個.
原因分析:
-
網絡帶寬問題:
檢查了下帶寬,總帶寬700M,峰值也才400M,同網絡下其他服務并未出現該情況,所以暫時排除網絡帶寬問題。 -
ng配置問題:
那么有沒有可能是我們ng配置問題呢,檢查了下我們的nginx.conf配置文件,發現配置的worker_connections足足有10240個,和我們云服務上的一樣,所以也排除掉我們ng服務的問題。 -
服務性能問題:
基本所有接口都會發生這樣的問題,同一個接口同樣的數據,不同時間請求是偶發的出現網絡繁忙,而且我們在云服務器也部署了同樣的系統,并沒有出現過這樣的情況,所以排除服務性能問題。 -
其他:
剩下的最大可能就是請求到達的第一個物理代理機的問題了。由于我們系統是B2B2C的,所以請求量比較大,在現場排查之后,發現大量請求停留在SYN_RECV,沒有分發到我們的代理服務器去,問題確定,由于請求量大服務器負載高,每次請求過來就需要建立TCP連接,然后請求結束后又需要關閉連接,開銷大。
解決方案:
調整了這個物理代理機上的nginx配置的keepalive參數,完成以下幾點:
- 減少連接建立時間:
keepalive
參數允許Nginx在一定時間內保持與后端服務器的連接處于活動狀態,而不是在每個請求之后立即關閉連接。這可以減少連接建立時間,因為Nginx不需要在每個請求之前重新建立TCP連接。 - 減少后端服務器負載:通過保持與后端服務器的連接處于活動狀態,
keepalive
參數可以減少后端服務器的連接建立和關閉的開銷。這可以降低后端服務器的負載,從而減少SYN_RECV
狀態的問題。 - 優化網絡帶寬利用率:
keepalive
參數可以減少網絡中的TCP握手和揮手消息的數量,從而優化網絡帶寬的利用率。這可以減少網絡擁塞的可能性,從而減少SYN_RECV
狀態的問題。 - 提高請求處理效率:通過保持與后端服務器的連接處于活動狀態,
keepalive
參數可以提高請求處理的效率。這是因為Nginx可以在同一連接上處理多個請求,而不需要在每個請求之后重新建立連接。
之后情況大大改善,基本沒有再出現過504 Gateway Time-out。