系统缺少足够的缓冲区空间或因为队列已满

系统缺少足够的缓冲区空间或因为队列已满

我的 ASP.NET 和 SQL Server 2012 应用程序在 Windows Server 2008 R2 上运行。突然,我的服务器上的互联网停止工作,我的应用程序开始抛出,

An operation on a socket could not be performed because the system lacked sufficient buffer 
space or because a queue was full

运行 netstat 显示 PID = 0 打开了很多端口。Netstat 说,

Process Id = 0, State = TIME_WAIT have 130,053 ports open
Process Id = 38840, State = CLOSE_WAIT have 5 ports open
Process Id = Any, State = LISTENING have 30 ports open
Process Id = Any, State = ESTABLISHED have 10 ports open

统计 2015 年 12 月 22 日,

CLOSE_WAIT  5   
ESTABLISHED 146
TIME_WAIT   646750
LAST_ACK    1
LISTENING   30

答案1

您正在运行一个可通过多个移动设备的浏览器访问的 Web 服务器。

由于 TCP/IP 的工作方式,连接无法立即关闭。数据包可能无序到达或在连接关闭后重新传输。CLOSE_WAIT 表示远程端点(连接的另一端)已关闭连接。TIME_WAIT 表示本地端点(此端)已关闭连接。连接被保留,以便任何延迟的数据包都可以与连接匹配并得到适当处理。如果连接在默认的四分钟内超时,则将被删除。

然而,TIME_WAIT 统计信息旁边的数字 646750 非常多。这意味着在过去 4 分钟内关闭了 646750 个连接,每秒关闭 2694 个!显然,其中一些移动设备出现严重故障,并且正在用未从客户端正确关闭的连接轰炸您的服务器,或者您正在为大量客户端提供服务(这对于单个服务器来说是没有意义的)。

如果您无法隔离哪些移动设备或应用程序是导致问题的原因并修复它们,那么您就无法控制客户端,而只能缓解服务器端的问题。

可以改善这种拥塞的一个参数是TcpTimedWaitDelay, 被形容为:

确定 TCP 释放已关闭的连接并重新使用其资源之前必须经过的时间。关闭和释放之间的间隔称为 TIME_WAIT 状态或 2MSL 状态。在此期间,重新打开连接对客户端和服务器的成本比建立新连接要低得多。

降低此条目的值可使 TCP 更快地释放已关闭的连接,从而为新连接提供更多资源。但是,如果此值太低,TCP 可能会在连接完成之前释放连接资源,从而要求服务器使用更多资源来重新建立连接。

TcpTimedWaitDelay 可以通过 regedit 修改 HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters。它包含等待的秒数。默认值为 240 秒(4 分钟)。如果更改,则需要重新启动。

例如,如果改为 30 秒,并且每秒有 2694 个连接,则意味着只有 80820 个连接在等待关闭。这个数字仍然很大,但这一变化仍将减少连接资源的使用。

答案2

同样的问题:https://serverfault.com/questions/661476/getting-an-operation-on-a-socket-could-not-be-performed-because-the-system-lack/

它是一个 Windows 最大连接问题,一些 kb 说更改最大临时端口或添加内存 :/

http://blogs.msdn.com/b/sql_protocols/archive/2009/03/09/understanding-the-error-an-operation-on-a-socket-could-not-be-performed-because-the-system-lacked-sufficient-buffer-space-or-because-a-queue-was-full.aspx

我在正常运行时间很长(8 个月以上)的物理服务器上看到了这个问题,重新启动解决了这个问题......

相关内容