Nginx做前端Proxy時TIME_WAIT過多的問題

來源:互聯網
上載者:User

標籤:

轉自:http://www.cnblogs.com/QLeelulu/p/3601499.html

 

我們的DSP系統目前基本非淩晨時段的QPS都在10W以上,我們使用Golang來處理這些HTTP請求,Web伺服器的前端用Nginx來做負載平衡,通過Nginx的proxy_pass來與Golang互動。

由於nginx代理使用了短連結的方式和後端互動的原因,使得系統TIME_WAIT的tcp串連很多:

shell> netstat -n | awk ‘/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}‘TIME_WAIT 250263CLOSE_WAIT 57FIN_WAIT2 3ESTABLISHED 2463SYN_RECV 8

ss 比 netstat 要快,所以也可以用下面的命令來查看:

shell> ss -ant | awk ‘NR>1 {++s[$1]} END {for(k in s) print k,s[k]}‘

這會佔用系統過多的連接埠,還浪費了系統資源,所以我們必須想辦法減少TIME_WAIT。

TIME_WAIT導致佔用過多連接埠的一個影響是會佔用我們需要使用到的連接埠,例如我們有個服務監聽的連接埠為8012,重啟的時候經常會提示連接埠被佔用。
通過查看/proc/sys/net/ipv4/ip_local_port_range可以知道設定的Linux核心自動分配連接埠的連接埠範圍:

shell> cat /proc/sys/net/ipv4/ip_local_port_range1025 65535

對於這個設定系統就會從1025~65535這個範圍內隨機分配連接埠來用於串連,而我們服務的8012連接埠剛好在這個範圍之內,所以如果8012剛好被系統分配出去使用了,則啟動我們服務的時候,就會提示連接埠被佔用。

所以我們需要設定/proc/sys/net/ipv4/ip_local_reserved_ports來告訴系統給我們預留哪些連接埠,不可以用於自動分配。

shell> vim /etc/sysctl.confnet.ipv4.ip_local_reserved_ports = 8012,11211-11220shell> sysctl -p

關於預留連接埠的更具體資訊可以參考:

  • 網路連接埠預留
  • 預留連接埠避免佔用ip_local_reserved_ports

上面我們解決了連接埠佔用問題,但是我們還是需要解決TIME_WAIT過多的問題。
Nginx 1.1以上版本的upstream已經支援keep-alive的,所以我們可以開啟Nginx proxy的keep-alive來減少tcp串連:

upstream http_backend {    server 127.0.0.1:8080;    keepalive 16;}server {    ...    location /http/ {        proxy_pass http://http_backend;        proxy_http_version 1.1;        proxy_set_header Connection "";        ...    }}

可以參加Nginx的官方文檔: http://nginx.org/cn/docs/http/ngx_http_upstream_module.html#keepalive

開了keep-alive之後,TIME_WAIT明顯減少:

shell> netstat -n | awk ‘/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}‘TIME_WAIT 12612CLOSE_WAIT 11FIN_WAIT1 4FIN_WAIT2 1ESTABLISHED 7667SYN_RECV 3

另外不少文章提到可以修改系統的/etc/sysctl.conf配置來減少TIME_WAIT的tcp串連:

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

參見: http://blog.s135.com/post/271/

不過開啟tcp_tw_recycle可能會帶來一些不穩定的網路問題,請參考:

  • 記一次TIME_WAIT網路故障
  • 再敘TIME_WAIT

關於sysctl相關配置的說明,請參考:
https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt

 

參考文章:

    • 部分網路核心參數說明
    • http://performancewiki.com/linux-tuning.html
    • tcp協議timestamp欄位導致問題分析
    • http://www.lognormal.com/blog/2012/09/27/linux-tcpip-tuning/

Nginx做前端Proxy時TIME_WAIT過多的問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.