Windows Server 2012 R2用尽了临时端口,尽管不应


13

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

请注意,我们已经调整HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters键值TcpTimedWaitDelay,并MaxUserPort分别以30和65530。

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

如果我跑

Get-Counter -Counter \TCPv4\*

要么

Get-Counter -Counter \TCPv6\*

要么

netstat -abn | find /c ":"

我总是得到500-1500个连接的合理值,甚至没有接近65K的极限。

此外,“本地主机”将停止本地解析为:: 1,还原为127.0.0.1。
只有强制重启计算机才能解决此问题。

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

更新1

重新启动邮件服务器后,它又发生了一次,似乎已经解决了。但是很奇怪,所有计数器显示约有1000个连接,而此时有约500个处于活动状态,当尝试连接到与邮件服务器无关的数据库时,仍然显示10055套接字错误。

更新2 这很奇怪,但是每天重新启动邮件服务可以完全解决问题。


1
我遇到了类似的问题,下面的链接为我修复了该问题:http

2
关于UPDATE2。因此,这仅表示邮件服务生成了太多连接而没有关闭它们,您并没有解决问题,而是将其隐藏直到变得更糟,并且每天需要2次重新启动一段时间……看起来像是隐藏而不是解决问题...
Mikhail

Answers:


9

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
  • MaxUserPort -65534
  • TcpNumConnections-应该处于默认状态,拉伸到最大值= 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


1
在回答之前,您应该已彻底阅读问题。当然,在问之前我确实尝试过这种解决方案,这很常见。我已经用另一种方法解决了这个问题。
CamaroSS

1
我认为每天重新启动邮件服务无法解决问题。您找到其他解决方案了吗?
MyKE 2015年

3
@CamaroSS:请分享您的解决方案(如果超出“重新启动邮件服务”范围,这不是解决方案)。另外,如果有人尝试帮助您,也许您应该对此有所感激。
斯文

@CamaroSS如果你读carefuly我的答案,你会看到“在结果同样喜欢你”,那么我已经张贴另一个信息..
的Myke

1
设置MaxUserPort在2012年仍然有效吗?我认为2012年必须通过netsh来完成。例如:netsh int ipv4 set dynamicport tcp start=25535 num=40000
rustyx

4

除了Tcpip驱动程序设置外,临时TCP端口范围在Windows Server中使用netsh命令(source)进行管理。

您可以使用以下命令查看动态端口范围:

  • 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

设置(start = 49152 num = 16384)也是Windows Server 2008及更高版本上的默认设置


非常感谢您-我已经花了数小时试图解决我的问题。我能找到的所有建议都是关于在注册表中调整MaxUserPort,而没有人提及netsh。
milosz

3

在使用chromewebdriver运行大量Selenium测试的Windows Server 2016上也发生了同样的问题。此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()


1

您确定没有泄漏数据库连接对象吗?您必须显式地(使用try-finally)或使用using {}块来关闭所有打开的数据库连接。这是ASP不会直接告诉您的常见问题。


它是一堆PHP网站,其中大多数都是通过使用持久连接的FastCGI运行的,所以情况并非如此。如果是这样,则系统计数器将返回更高的值。我也无法解释为什么本地主机突然停止解析为:: 1并改为解析为127.0.0.1。
CamaroSS 2014年

2
:: 1消失可能只是允许的端口溢出的副作用-我怀疑Windows会尝试IPv6 ping,并且当它无法获取端口进行尝试时,它会退回到IPv4。PHP不属于我的专业领域。:-( ..祝你好运!
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.