【问题标题】:Windows kernel queuing outbound network connectionsWindows 内核排队出站网络连接
【发布时间】:2013-05-15 16:00:51
【问题描述】:

我们有一个应用程序(元搜索引擎)必须频繁地建立 50 到 250 个出站 HTTP 连接以响应用户操作。

我们这样做的方法是创建一堆 HttpWebRequest 并使用 Action.BeginInvoke 异步运行它们。这显然使用 ThreadPool 来启动 web 请求,这些请求在自己的线程上同步运行。请注意,目前是这种方式,因为它最初是一个 .NET 2.0 应用程序,并且没有 TPL 可言。

使用 ETW(我们的事件源与 .NET 框架和内核事件源相结合)和 NetMon 是,虽然线程池可以在大约 300 毫秒内启动 200 个线程运行我们的代码(因此,这里没有线程池耗尽问题),它占用Windows 内核建立所有已排队的 TCP 连接的时间不定,有时长达 10 到 15 秒。

这在 NetMon 中非常明显 - 您会立即看到大约 60 到 100 个 TCP 连接打开 (SYN)(数量会有所不同,但不会超过 120 个左右),然后其余的会在一段时间内逐渐增加。就好像连接在某个地方排队,但我不知道在哪里,也不知道如何调整它,以便我们可以执行更多并发的传出连接。 Perfmon Outbound Connection Queue 保持为 0,但在 Connections established 计数器中,您可以看到连接的初始峰值,然后随着其余的过滤器逐渐增加。

我们正在连接的端点的延迟似乎确实起到了一定的作用,因为在它所连接的端点附近运行代码并没有显着显示问题。

我已经进行了全面的 ETW 跟踪,但没有关于许多 Microsoft 提供商的合适文档,我相信这会有所帮助。

任何解决此问题的建议或有关为大量传出连接调整窗口的建议都会很棒。平台是 Win7 (dev) 和 Win2k8R2 (prod)。

【问题讨论】:

标签: c# windows performance networking tcp


【解决方案1】:

看起来缓慢的 DNS 查询是这里的罪魁祸首。查看 ETW 提供程序“Microsoft-Windows-Networking-Correlation”,我可以跟踪从开始到连接的网络调用,并注意到许多连接在 DNS 解析器 (Microsoft-Windows-RPC) 上花费的时间超过 1 秒。

我们的本地 DNS 服务器似乎很慢/无法处理我们给它的负载并且没有积极缓存。生产没有表现出像 prod DNS 服务器做的一切正常那样严重的症状。

【讨论】:

    猜你喜欢
    • 2014-04-06
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 2014-07-23
    • 2012-01-28
    相关资源
    最近更新 更多