Socket 连接问题之大量 TIME_WAIT
简评:最近项目就出现了大量短连接导致建立新连接超时问题,最后是通过维护长连接解决的。
代理或者服务器设备都有端口限制,如果使用 TCP 连接,连接数量达到端口限制,在这种情况下,将不能创建新的连接。
TIME-WAIT
这是 TCP 连接完全关闭前的最后一个状态,一个连接被关闭时,主动关闭的一端最后会进入 TIME_WAIT 状态,等待足够的时间以确保远程 TCP 接收到连接中断请求的确认,这个时间最大为四分钟,可调整。
如何检测
Kernel 信息:
kernel: TCP: request_sock_TCP: Possible SYN flooding on port 8009. Sending cookies. Check SNMP counters.
检查连接 TIME_WAIT 状态个数
watch -n 1 "netstat -nt | grep TIME_WAIT | wc -l"
如果数量接近端口限制,则系统将受到此问题的影响
cat /proc/sys/net/ipv4/ip_local_port_range
解决办法
1.开启 TIME_WAIT 重用
默认情况下,Linux 会从临时端口范围中选择一个端口,临时端口范围在 32768 至 61000之 间。除非设置了 SO_REUSEADDR 标志,否则已绑定的 TCP 本地地址端口在关闭后一段时间内不可用。使用此标志时请谨慎,因为它会使 TCP 连接变的不可靠。
为了避免等待关闭同时启用 TIME_WAIT 的重用,可以向文件 /etc/sysctl.conf 添加以下行来开启:
net.ipv4.tcp_tw_reuse = 1
2.短连接变长连接
如果有高并发请求功能,服务端是自己的服务器时,TCP 通信最好采用长连接,避免大量短连接每次建立/释放产生的各种开销;如果建立连接的目标服务器不是自己的,那就要考虑对方是否支持长连接方式。
原文链接:What you need to do if you see too many TIME_WAIT sockets