如何完全终止 HttpWebRequest
How to fully terminate HttpWebRequest
尽管我在检查现有 HTTP 连接时正确终止了所有内容,但我发现它们没有终止
例如当我通过启动不同的任务打开 200 个并发连接时
我明白了
158 Established HTTP connections
927 TimeWait
95 SynSent
24 LastAck
6 CloseWait
34 FinWait
更糟糕的是,TimeWait 的数量每分钟都在增加
那么我该如何防止此类问题的发生呢?
一段时间后 windows 变得无法发出任何新请求
当我使用 webproxies 时出现此问题:Too many proxy connection kills window's resolving hosts ability
这里当我使用不同代理的 200 个连接时
处于 TimeWait 状态的连接会产生性能问题。
首先看一下TCP状态图,
https://en.wikipedia.org/wiki/File:Tcp_state_diagram_fixed_new.svg
这是机器的 TCP 发送 ACK 段以响应从其对等方接收到的 FIN 段后的 TCP 连接状态(详细信息参见 1981 年定义 TCP 的 RFC 793 http://www.ietf.org/rfc/rfc793.txt)。在此状态期间,套接字资源,包括 TCB(TCP 控制块)和端口,当然不会释放到 OS。超时到期后,套接字资源被释放到 OS。最初的原因是为了处理在不可靠介质中对等点之间可能发生的双将军问题。连接将处于 TimeWait 状态,直到出现可配置的超时,该超时具有取决于操作系统的默认值。
这些链接可以帮助您设置 Windows 中的 TcpTimedWaitDelay 参数:
https://technet.microsoft.com/en-us/library/cc938217.aspx
http://msdn.microsoft.com/en-us/library/ee377084%28v=bts.10%29.aspx
它说默认值为 240 秒,但我的测试我经历了更短的时间(在 60 到 120 之间)。
无论如何,今天的网络更加可靠,需要高性能和吞吐量的 Web 服务应该降低这个值。我建议将它设置为 5 秒。如果你想更保守一点,设置为30秒。
其他可能对您有用的参数是允许客户端打开的最大临时端口数 Windows。 Windows 服务器默认限制临时 TCP 端口的最大数量。在某些 Windows 中,此值可能为 5000。您可以通过在注册表中设置值 MaxUserPort 来更改此行为。
尽管我在检查现有 HTTP 连接时正确终止了所有内容,但我发现它们没有终止
例如当我通过启动不同的任务打开 200 个并发连接时
我明白了
158 Established HTTP connections
927 TimeWait
95 SynSent
24 LastAck
6 CloseWait
34 FinWait
更糟糕的是,TimeWait 的数量每分钟都在增加
那么我该如何防止此类问题的发生呢?
一段时间后 windows 变得无法发出任何新请求
当我使用 webproxies 时出现此问题:Too many proxy connection kills window's resolving hosts ability
这里当我使用不同代理的 200 个连接时
处于 TimeWait 状态的连接会产生性能问题。
首先看一下TCP状态图,
https://en.wikipedia.org/wiki/File:Tcp_state_diagram_fixed_new.svg
这是机器的 TCP 发送 ACK 段以响应从其对等方接收到的 FIN 段后的 TCP 连接状态(详细信息参见 1981 年定义 TCP 的 RFC 793 http://www.ietf.org/rfc/rfc793.txt)。在此状态期间,套接字资源,包括 TCB(TCP 控制块)和端口,当然不会释放到 OS。超时到期后,套接字资源被释放到 OS。最初的原因是为了处理在不可靠介质中对等点之间可能发生的双将军问题。连接将处于 TimeWait 状态,直到出现可配置的超时,该超时具有取决于操作系统的默认值。
这些链接可以帮助您设置 Windows 中的 TcpTimedWaitDelay 参数:
https://technet.microsoft.com/en-us/library/cc938217.aspx http://msdn.microsoft.com/en-us/library/ee377084%28v=bts.10%29.aspx
它说默认值为 240 秒,但我的测试我经历了更短的时间(在 60 到 120 之间)。
无论如何,今天的网络更加可靠,需要高性能和吞吐量的 Web 服务应该降低这个值。我建议将它设置为 5 秒。如果你想更保守一点,设置为30秒。
其他可能对您有用的参数是允许客户端打开的最大临时端口数 Windows。 Windows 服务器默认限制临时 TCP 端口的最大数量。在某些 Windows 中,此值可能为 5000。您可以通过在注册表中设置值 MaxUserPort 来更改此行为。