怎样解决web中出现大量TIME_WAIT问题

今天就跟大家聊聊有关怎样解决web中出现大量TIME_WAIT问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

创新互联建站从2013年创立,先为东兴等服务建站,东兴等地企业,进行企业商务咨询服务。为东兴企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。

新增的一组Apache服务器上线以来,我用netstat -an命令发现服务器中有大量状态为TIME-WAIT的TCP连接,于是用/sbin/sysctl -a查看了一下Linux的各项内核参数,并翻阅有关资料,决定修改其中的两项参数,以达到减少TCP连接中TIME-WAIT sockets的目的。

vi /etc/sysctl.conf

编辑/etc/sysctl.conf文件,增加四行:

引用


   
   
   net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 30

说明:

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状态的时间。


 

再执行以下命令,让修改结果立即生效:

/sbin/sysctl -p


 

用以下语句看了一下服务器的TCP状态:

   
   
   netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

返回结果如下:

ESTABLISHED 1423

FIN_WAIT1 1

FIN_WAIT2 262

SYN_SENT 1

TIME_WAIT 962


 

效果:处于TIME_WAIT状态的sockets从原来的10000多减少到1000左右。处于SYN_RECV等待处理状态的sockets为0,原来的为50~300。

下面附上TIME_WAIT状态的意义:


 

客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连 接的端口

状态为TIME_WAIT


 

是不是所有执行主动关闭的socket都会进入TIME_WAIT状态 呢?

有没有什么情况使主动关闭的socket直接进入CLOSED状态呢?


 

主动关闭的一方在发送最后一个 ack 后

就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间

这个是TCP/IP必不可少的,也就是“解决”不了的。


 

也就是TCP/IP设计者本来是这么设计的

主要有两个原因

1。防止上一次连接中的包,迷路后重新出现,影响新连接

(经过2MSL,上一次连接中所有的重复包都会消失)

2。可靠的关闭TCP连接

在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发

fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以

主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。

TIME_WAIT 并不会占用很大资源的。  还有,如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态。

看完上述内容,你们对怎样解决web中出现大量TIME_WAIT问题有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注创新互联行业资讯频道,感谢大家的支持。


分享名称:怎样解决web中出现大量TIME_WAIT问题
分享路径:http://ybzwz.com/article/ghsodo.html