最近數據庫連接總隔段時間出現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