客户端有大量的time wait出现怎么办?

872 阅读2分钟

当请求量比较大的时候,而且所有的请求都是短连接的时候。

**如何查看:**netstat -nt | grep time_wait | wc -l

摘自一个老哥的实战记录:(部分内容)

TIME_WAIT状态的连接竟然多大3000多,这时候怀疑这个造成的,所以就查了一下资料,主要原因:

1.nginx开启了keepalive ,而且默认用的http1.1

2.tomcat开启了keepalive,默认也使用http1.1

3.但是nginx代理却使用的http1.0,默认不开启keepalive,所以就造成了大量的TIME-WAID状态的TCP连接

解决办法:

1.开启 TIME_WAIT 重用 默认情况下,Linux 会从临时端口范围中选择一个端口,临时端口范围在 32768 至 61000之 间。除非设置了 SO_REUSEADDR 标志,否则已绑定的 TCP 本地地址端口在关闭后一段时间内不可用。使用此标志时请谨慎,因为它会使 TCP 连接变的不可靠。

为了避免等待关闭同时启用 TIME_WAIT 的重用,可以向文件 /etc/sysctl.conf 添加以下行来开启: net.ipv4.tcp_tw_reuse = 1

2.短连接变长连接 如果有高并发请求功能,服务端是自己的服务器时,TCP 通信最好采用长连接,避免大量短连接每次建立/释放产生的各种开销;如果建立连接的目标服务器不是自己的,那就要考虑对方是否支持长连接方式。

首先服务器可以设置SO_REUSEADDR套接字选项来通知内核,如果端口忙,但TCP连接位于TIME_WAIT状态时可以重用端口。在一个非常有用的场景就是,如果你的服务器程序停止后想立即重启,而新的套接字依旧希望使用同一端口,此时SO_REUSEADDR选项就可以避免TIME_WAIT状态。

net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;

net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

net.ipv4.tcp_fin_timeout = 30表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。

参考文章:www.cnblogs.com/dadonggg/p/…

www.cnblogs.com/noobkey/p/4…