Linux TIME_WAIT问题

TIME_WAIT造成原因

TIME_WAIT是由于在TCP连接中客户端主动关闭连接生成的,如果是在本地,一般是大量短链接操作完成后关闭造成,比如脚本在进行SQL操作时没注意连接问题,每次都开关一次mysql连接,在每次完成一次查询后,就会留下一个TIME_WAIT状态,如果脚本中有大量SQL查询,在执行完脚本完就有大量TIME_WAIT数,TIME_WAIT在2MSL后进入CLOSED状态,在一个连接进入CLOSED状态前,是不能被重用的。

TIME_WAIT的影响

占用连接端口,主要,LINUX默认本地端口范围不到3万,可以通过;
大量连接会消耗少量内存,次要;

优化方向

1、有连接操作的脚本要注意连接数,尽量减少连接;

2、如果是其它程序导致的TIMEWAIT状态(比如nginx的反向代理,nginx与php之前的短链接交互),尝试通过长链接keepalive解决(当然长链接有长链接的问题,太多会有服务器性能问题);

3、内核参数优化:
修改/etc/sysctl.conf
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1 默认不要在线上使用,除非你能确定客户端不在NAT环境里,比如前端是反向代理,作为反向代理的后端只与反向代理连接的话,就可以在后端开启;

#keepalive setting
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_keepalive_intvl = 20
net.ipv4.tcp_keepalive_probes = 5

保存:sysctl -p

4、修改ipv4.ip_local_port_range,增大可用端口,但只能缓解问题:
net.ipv4.ip_local_port_range = 1024 65535

注意:
tcp_tw_recycle = 1,网上一般推荐开启这个选项,开了后TIME_WAIT会很快降低;

这个选项需要与net.ipv4.tcp_timestamps(默认开启)配合使用,销毁TIME_WAIT,开启后内核会快速回收TIME_WAIT状态的socket连接,回收时间是根据RTT动态计算,远小于2MSL。

但当服务器开启这个选项后,如果客户端的网络环境是NAT,访问服务器的时候会容易丢包,连接超时,因为NAT下各客户端发送到服务端的包里的时间戳不同,而对于同一IP的客户端,服务端只会记录最后到达服务端的时间戳,如果有时间戳小于记录值的新包到达,会被服务端丢弃。所以一般不推荐开启这个参数。


- - END - -


腾讯云
0%