解决No buffer space available

遇到问题:

 

原因分析:由于系统缓冲空间不足或队列已满,在运行 Windows Server 2008 R2 或 Windows 7 的多处理器计算机上的内核套接字泄漏。不能执行套接字上的操作。

问题解决:

1、补丁升级(Windows6.1-KB2577795-x64.msu)

http://thehotfixshare.net/board/index.php?autocom=downloads&showfile=13913

安装,重启即可。

 

生产环境临时解决:

重启服务,建立连接,由于并发或者请求过多导致,由于大量连接处于time-wait,这样就导致了很多服务器的资源被大量消耗。

 

TIME_WAIT状态的由来

我们知道,TCP关闭连接需要经过四次握手,为什么是四次握手,而不是像建立连接那样三次握手,看看下面三次握手和四次握手的流程图。

 

三次握手建立连接示意图

 

四次握手关闭连接示意图

而四次握手关闭连接示意图中,TCP协议中,关闭TCP连接的是Server端(当然,关闭都可以由任意一方发起),当Server端发起关闭连接请求时,向Client端发送一个FIN报文,Client端收到FIN报文时,很可能还有数据需要发送,所以并不会立即关闭SOCKET,所以先回复一个ACK报文,告诉Server端,“你发的FIN报文我收到了”。当Client端的所有报文都发送完毕之后,Client端向Server端发送一个FIN报文,此时Client端进入关闭状态,不在发送数据。

Server端收到FIN报文后,就知道可以关闭连接了,但是网络是不可靠的,Client端并不知道Server端要关闭,所以Server端发送ACK后进入TIME_WAIT状态,如果Client端没有收到ACK则Server段可以重新发送。Client端收到ACK后,就知道可以断开连接了。Server端等待了2MSL(Max Segment Lifetime,最大报文生存时间)后依然没有收到回复,则证明Client端已正常断开,此时,Server端也可以断开连接了。2MSL的TIME_WAIT等待时间就是由此而来。

我们知道了TIME_WAIT的由来,TIME_WAIT状态最大保持时间是2 * MSL,在1-4分钟之间,所以当系统并发过大,Client-Server连接数过多,Server端会在1-4分钟之内积累大量处于TIME_WAIT状态的无法释放的socket连接,导致服务器效率急剧下降,甚至耗完服务器的所有资源,最终导致No buffer space available (maximum connections reached?): connect问题的发生。

 

查看TIME WAIT相关的Windows命令:

netstat -ano   windows下查看当前所有的tcp连接
 
netstat -ano |findstr "8080"  windows下查看所有8080端口的tcp连接
 
netstat -ano |findstr "TIME_WAIT"  windows下查看所有的“TIME_WAIT”状态的tcp连接
 
netstat -ano |find /i /c "TIME_WAIT"   windows下统计time_wait出现的次数(按行统计) /i 忽略大小写

 

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值