Windows 2008 上 TIME_WAIT 状态下的大量 TCP 连接 - 在亚马逊 AWS 上运行

17 windows windows-server-2008 amazon-ec2 tomcat6

操作系统:Windows Server 2008,SP2(在 EC2 Amazon 上运行)。

使用 Apache httpd 和 tomcat 服务器 6.02 运行 Web 应用程序,并且 Web 服务器具有保持活动设置。

大约有 69,250 个(http 端口 80)+ 15000 个(端口 80 除外)处于 TIME_WAIT 状态的 TCP 连接(使用 netstat 和 tcpview)。即使停止 Web 服务器(等待 24 小时),这些连接似乎也没有关闭

性能监视器计数器:

  • TCPv4 活动连接数:145K
  • TCPv4 被动连接:475K
  • TCPv4 故障连接数:16K
  • TCPv4 连接重置:23K

HKEY_LOCAL_MACHINE\System \CurrentControlSet\Services\Tcpip\Parameters 没有 TcpTimedWaitDelay 键,所以值应该是默认值(2*MSL,4 分钟)

即使有数千个连接请求同时到来,为什么 Windows OS 最终无法清除它们?
这种情况背后的原因可能是什么?
有没有办法在不重新启动 Windows 操作系统的情况下强行关闭所有这些 TIME_WAIT 连接?

几天后,我们的应用程序停止接受任何新连接。

Gre*_*egB 14

我们也一直在处理这个问题。看起来亚马逊找到了根本原因并纠正了它。这是他们给我的信息。

嗨,我在下面粘贴了导致此问题的原因的解释。好消息是我们的工程团队最近已经修复了这个问题。要获得修复,您所要做的就是停止/启动您看到此问题的 Windows Server 2008 实例。同样,我不是在谈论不同的 REBOOT。STOP/START 导致实例移动到不同的(健康的)主机。当这些实例再次启动时,它们将在已修复的主机上运行,​​因此它们不会再次出现此问题。下面是这个问题的工程解释。经过深入调查,我们发现在大多数可用实例类型上运行 Windows 2008 x64 时,我们 已经发现了一个问题,该问题可能导致 TCP 连接在 TIME_WAIT/CLOSE_WAIT 中停留过长的时间(在某些情况下,无限期地保持在此状态)。在这些状态下,特定的套接字对仍然不可用,如果累积足够多,将导致相关端口的端口耗尽。如果发生这种特殊情况,清除有问题的套接字对的唯一解决方案是重新启动有问题的实例。我们已确定原因是 Windows 2008 内核 API 中的计时器函数产生的值,在我们的许多 64 位平台上,该函数偶尔会检索到一个非常遥远的未来值。这会导致 TCP 套接字对上的时间戳在未来被显着标记,从而影响 TCP 堆栈。根据微软的说法,有一个存储的累积计数器,除非此 API 调用产生的值大于累积值,否则不会更新。最终的结果是,在这一点之后创建的套接字都将在未来被标记得太远,直到到达未来的时间。在某些情况下,我们已经在未来几百天看到这个值,因此套接字对似乎永远卡住了。


Rya*_*des 2

至少可以说,Windows 中 TCP 堆栈的默认设置对于要托管 HTTP 服务器的系统来说并不是最佳的。

为了在用作 HTTP 服务器时充分利用 Windows 计算机,您通常需要调整一些参数,例如 MaxUserPort TcpTimedWaitDelay、TcpAckFrequency、EnableDynamicBacklog、KeepAliveInterval 等

几年前,我曾就此给自己写过一条注释,以防万一我需要一些快速默认设置。请随意理解参数,然后调整它们。