RTB Dev tcp 狀態統計

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

Posted on 14 三月, 2014 in Linux, 高性能Web服務 html

咱們的DSP系統目前基本非凌晨時段的QPS都在10W以上,咱們使用Golang來處理這些HTTP請求,Web服務器的前端用Nginx來作負載均衡,經過Nginx的proxy_pass來與Golang交互。前端

因爲nginx代理使用了短連接的方式和後端交互的緣由,使得系統TIME_WAIT的tcp鏈接不少:linux


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



ss 比 netstat 要快,因此也能夠用下面的命令來查看:web

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

這會佔用系統過多的端口,還浪費了系統資源,因此咱們必須想辦法減小TIME_WAIT。vim

TIME_WAIT致使佔用過多端口的一個影響是會佔用咱們須要使用到的端口,例如咱們有個服務監聽的端口爲8012,重啓的時候常常會提示端口被佔用。
經過查看/proc/sys/net/ipv4/ip_local_port_range能夠知道設置的Linux內核自動分配端口的端口範圍:後端


shell> cat /proc/sys/net/ipv4/ip_local_port_range服務器

1025 65535網絡

對於這個設置系統就會從1025~65535這個範圍內隨機分配端口來用於鏈接,而咱們服務的8012端口恰好在這個範圍以內,因此若是8012恰好被系統分配出去使用了,則啓動咱們服務的時候,就會提示端口被佔用。

因此咱們須要設置/proc/sys/net/ipv4/ip_local_reserved_ports來告訴系統給咱們預留哪些端口,不能夠用於自動分配。

shell> vim /etc/sysctl.conf

net.ipv4.ip_local_reserved_ports = 8012,11211-11220

 

shell> sysctl -p

關於預留端口的更具體信息能夠參考:

上面咱們解決了端口占用問題,可是咱們仍是須要解決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作前端Proxy時TIME_WAIT過多的問題

Posted on 14 三月, 2014 in Linux, 高性能Web服務

咱們的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 250263 CLOSE_WAIT 57 FIN_WAIT2 3 ESTABLISHED 2463 SYN_RECV 8

1

2

3

4

5

6

shell> netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'

TIME_WAIT 250263

CLOSE_WAIT 57

FIN_WAIT2 3

ESTABLISHED 2463

SYN_RECV 8

ss 比 netstat 要快,因此也能夠用下面的命令來查看:

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

1

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_range 1025 65535

1

2

shell> cat /proc/sys/net/ipv4/ip_local_port_range

1025 65535

對於這個設置系統就會從1025~65535這個範圍內隨機分配端口來用於鏈接,而咱們服務的8012端口恰好在這個範圍以內,因此若是8012恰好被系統分配出去使用了,則啓動咱們服務的時候,就會提示端口被佔用。

因此咱們須要設置/proc/sys/net/ipv4/ip_local_reserved_ports來告訴系統給咱們預留哪些端口,不能夠用於自動分配。

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

1

2

3

4

shell> vim /etc/sysctl.conf

net.ipv4.ip_local_reserved_ports = 8012,11211-11220

 

shell> sysctl -p

關於預留端口的更具體信息能夠參考:

上面咱們解決了端口占用問題,可是咱們仍是須要解決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 "";        ...    } }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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 12612
CLOSE_WAIT 11
FIN_WAIT1 4
FIN_WAIT2 1
ESTABLISHED 7667
SYN_RECV 3


另外很多文章提到能夠修改系統的/etc/sysctl.conf配置來減小TIME_WAIT的tcp鏈接:

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

1

2

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

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

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

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

相關文章
相關標籤/搜索