高手的存在,就是让服务10亿人的时候,你感觉只是为你一个人服务......

nginx 高并发时出现大量tcp tim-wait解决方法

目录
  1. 1. 解决方法
    1. 1.1. 修改系统配置参数
    2. 1.2. 修改nginx 配置 ,加入http1.1 keepalive

nginx 在高并发时出现大量TIME-WAIT状态的tcp连接。
ss -ant | awk ‘NR>1 {++s[$1]} END {for(k in s) print k,s[k]}’

Alt text


解决方法

修改系统配置参数

进行操作系统配置参数优化,但是没有解决问题。
这里使用的centos6, vim /etc/sysctl.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
net.core.netdev_max_backlog = 30000
net.ipv4.tcp_no_metrics_save=1
net.core.somaxconn = 262144
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
fs.file-max = 999999
net.ipv4.tcp_tw_reuse = 1
net.nf_conntrack_max = 655360
net.netfilter.nf_conntrack_max = 655350
net.netfilter.nf_conntrack_tcp_timeout_established = 1200
net.ipv4.tcp_max_tw_buckets = 2000

执行sysctl -p使之生效。
发现上面这种方式配置后tcp连接数没有得到改善。


修改nginx 配置 ,加入http1.1 keepalive

具体可以参考:http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive

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 "";
...
}
}

经过此优化后,tcp time-wait数量下来了

Alt text