解决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 忽略大小写
发布了77 篇原创文章 · 获赞 123 · 访问量 30万+

猜你喜欢

转载自blog.csdn.net/han0373/article/details/102815486