Windows Server 2012 R2 耗尽临时端口,尽管它不应该如此

Windows Server 2012 R2 耗尽临时端口,尽管它不应该如此

我们的专用服务器经常遇到奇怪的网络问题。该服务器在 Xeon E5620 上运行 Windows Server 2012 R2 x64,配有 16 GB RAM 和 Intel 82575EB 网络适配器。

请注意,我们已经将HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters键值TcpTimedWaitDelayMaxUserPort分别调整为 30 和 65530。

在某个随机时间点,我们的网站停止响应,原因是它们无法连接到本地数据库。当这个问题开始发生时,大约正常运行了 2 周。系统日志开始收到 TCPIP 警告 4227 和 4231。它指出“由于所有这些端口都在使用中,从全局 TCP 端口空间分配临时端口号的请求失败。”。

如果我跑

Get-Counter -Counter \TCPv4\*

或者

Get-Counter -Counter \TCPv6\*

或者

netstat -abn | find /c ":"

我总是得到 500-1500 个连接的合理值,这甚至还接近 65K 的限制。

此外,“localhost”停止在本地解析为::1,而是恢复为 127.0.0.1,
只有强制重启机器才能解决这种情况。

可能是网络适配器的问题吗?

更新 1

这个问题又出现了,我重启邮件服务器后似乎解决了。但奇怪的是,所有计数器都显示约 1000 个连接,其中约 500 个处于活动状态,尝试连接数据库时仍然出现 10055 套接字错误,这与邮件服务器无关。

更新2 这确实很奇怪,但每天重启邮件服务就能彻底解决问题。

答案1

我在 WinSvr 2012R2 x64 上遇到了类似的问题,TCP/IP 端口池耗尽近 1 个月,服务器停止接收任何新连接和 TCP 连接。所以我尝试了注册表值,这些对我来说是稳定的:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"TcpTimedWaitDelay"=dword:0000001e
"MaxUserPort"=dword:0000fffe
"TcpNumConnections"=dword:00fffffe
"TcpMaxDataRetransmissions"=dword:00000005
  • TcpTimedWaitDelay- 30
  • 最大用户端口- 65534
  • Tcp连接数- 应处于默认状态并延伸至最大值 = 16777214 应防止服务器耗尽临时端口。
  • TcpMaxDataRetransmissions- 实际连接上 TCP 未确认数据段重传的超时限制 = 5。

结果和你的一样。我认为你应该考虑审核你的应用程序/脚本性能的行为。如果一切正常且没有任何帮助,那么你可以尝试将代理服务器放在你的 Web 应用程序服务器之前,使用 Web 服务器(IIS、Apache 等)创建 2 个节点,它们将共享相同的静态内容并同时访问相同的数据库(如果你的公司有足够的资源)。

也许这篇文章能给你带来一些帮助:http://blogs.technet.com/b/tristank/archive/2008/03/11/maxuserport-what-it-is-what-it-does-when-it-s-important.aspx

答案2

遇到了同样的问题Windows 服务器 2016使用 chromewebdriver 运行大量 Selenium 测试。此 PS 脚本将自动配置上面分享的 @Myke 设置。shutdown添加该命令是因为 TCP 堆栈更改需要重新启动。

增加临时 TCP 端口的池大小

Get-Item 'HKLM:\System\CurrentControlSet\Services\Tcpip\Parameters' | New-ItemProperty -Name MaxUserPort -Value 65534 -Force | Out-Null
Get-Item 'HKLM:\System\CurrentControlSet\Services\Tcpip\Parameters' | New-ItemProperty -Name TcpTimedWaitDelay -Value 30 -Force | Out-Null
Get-Item 'HKLM:\System\CurrentControlSet\Services\Tcpip\Parameters' | New-ItemProperty -Name TcpNumConnections -Value 16777214 -Force | Out-Null
Get-Item 'HKLM:\System\CurrentControlSet\Services\Tcpip\Parameters' | New-ItemProperty -Name TcpMaxDataRetransmissions -Value 5 -Force | Out-Null

shutdown -r -t 0

这是我们收到的错误消息,Webdriver.Quit()提示我们 TCP 地址正在被使用。

错误:EADDRINUSE 在 ClientRequest 处连接 EADDRINUSE 127.0.0.1:12843。(\node_modules\selenium-webdriver\http\index.js:238:15)
:任务:WebDriver.quit()

答案3

除了 Tcpip 驱动程序设置外,Windows Server 中还使用网络管理员命令 (来源)。

你可以看法使用以下命令更改动态端口范围:

  • netsh int ipv4 show dynamicport tcp
  • netsh int ipv4 show dynamicport udp
  • netsh int ipv6 show dynamicport tcp
  • netsh int ipv6 show dynamicport udp

改变端口范围,使用此命令:

  • netsh int <ipv4|ipv6> set dynamic <tcp|udp> start=number num=range

例如:

netsh int ipv4 set dynamicport tcp start=49152 num=16384

设置(开始=49152数量=16384)也是默认在 Windows Server 2008 及更高版本上。

答案4

您是否确定没有泄漏数据库连接对象?您必须关闭打开的每个数据库连接,无论是显式关闭(使用 try-finally)还是使用 using { } 块。这是一个常见问题,ASP 不会直接告诉您。

相关内容