最近数据库连接总隔段时间出现provider: TCP 提供程序, error: 0 - 由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。 的错误。但这并不是SQL Server服务本身导致了此问题,实际上是来自 Windows系统,由机器的内存或TCP端口问题导致。我这里是由于连接过多,导致端口耗尽(根据操作系统的报错来排查)。
已经知道问题根本原因之后,那么解决问题就变得简单了。
Windows 2008 以后,微软遵从国际标准,动态端口的数量调整为16384个 (从49152起始,到65536结束),如果服务器对外有大量连接,而TCP默认的Time Wait Delay时间为2分钟这可能导致端口耗尽。
解决方法如下:
以管理员身份打开CMD,运行如下命令:
netsh interface ipv4 show tcpstats netsh int ipv4 show dynamicport tcp
查看一下,是否端口耗尽,目前端口数量是多少,如果确认端口耗尽就需要增大端口数量来解决。
2、 增大动态端口数量
netsh int ipv4 set dynamicport tcp start=1025 num=60000
其中1025是起始端口号,num为数量,上述命令意思为从1025开始的60000个端口,到61025结束。
注:该步骤无需重启机器, 立即生效
3、 降低Time Wait时间,最低为30秒
打开注册表,定位到 HKLM/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters
新增键值 TcpTimedWaitDelay,类型REG_DWORD , 设置为十进制30
注:修改后重启生效
以上是对ipv4下的tcp协议操作,其他协议命令如下:
netsh int ipv4 show dynamicport tcp netsh int ipv4 show dynamicport udp netsh int ipv6 show dynamicport tcp netsh int ipv6 show dynamicport udp