【问题标题】:Multi-threaded WebRequest calls and contention多线程 WebRequest 调用和争用
【发布时间】:2010-12-01 05:15:58
【问题描述】:

我正在运行一个多线程的 C# 控制台应用程序。核心进程检索一些要处理的数据,将其拆分为可配置数量的较小数据集,然后生成相同数量的线程来处理每个数据子集。

要处理单个记录,线程必须使用 WebRequest 类和 POST 方法调用 Web 服务。使用 GetRequestStream() 发送查询,使用 GetResponse() 检索响应。

在伪代码中,例程如下所示:

prepare WebRequest data;
* get time (start-of-Processing);
Stream str = request.GetRequestStream();
Write data to stream;
stream.Close();
WebResponse resp = request.GetResponse();
* get time (response-received);
process response;
finally close response stream;

时序数据表明,当我们将数据拆分为 4 个以上的线程时,整个进程的吞吐量并没有提高,在某些情况下甚至会下降。来自网络服务的计时数据保持其性能保持不变。

  • 在 4 个线程时,我们的明显开销 发送数据并检索 响应流平均值约为 第二。
  • 当我们运行超过 4 个线程时, 平均值随最大值上升 遇到几十秒!

今天我能够运行两个独立的进程,每个进程运行 4 个线程(但基本上确保每个线程仍在运行唯一数据)。这一次,我们的整体吞吐量几乎翻了一番,每个流程的稳定时间约为一秒。

这让我相信我们在与 WebRequest 类相关的资源上遇到了某种限制;但这是每个进程的限制,而不是机器限制。我知道我们可以使用 BeginGetRequestStream 和 BeginGetResponse 异步进行调用,但我怀疑如果我们实际上达到某种资源限制,它是否会产生积极影响?!

我应该注意什么才能使我们在单个进程中增加拆分数量而不降低性能?

【问题讨论】:

    标签: c# multithreading httpwebrequest


    【解决方案1】:

    您需要提高可以向单个主机发出的同时 Web 请求的数量 - 否则尽管有足够的 CPU 可用,但您的线程基本上会相互等待完成。最简单的方法是使用app.config<connectionManagement> 元素:

    <configuration>
      <system.net>
        <connectionManagement>
          <add address = "*" maxconnection = "100" />
        </connectionManagement>
      </system.net>
    </configuration>
    

    【讨论】:

    • 谢谢乔恩 - 这听起来很有希望......一旦我有机会测试这将提供更多反馈,这将是明天:)
    • 谢谢谢谢谢谢约翰!这种配置更改不仅使我能够增加正在运行的线程数,而且还大大减少了“一秒钟”的开销——所以我一定已经遇到了很多争用。
    • support.microsoft.com/en-us/kb/821268 此 Microsoft KB 建议使用 12*Number of processor 作为值,但还列出了与 ASP .Net 线程池一起传出异步调用的性能直接相关的其他配置值。
    【解决方案2】:

    您运行它的计算机有多少个处理器/内核?

    当您调度的线程数超过系统中的内核数时,调度程序必须对每个线程进行时间切片,并安排它们在可用内核上运行。因此,除非您的流程中存在死区时间,否则性能不会提高并且实际上可能会下降 - 这就是您所描述的。

    【讨论】:

    • 如果每个 Web 请求大约需要一秒钟,这听起来像应用程序离 CPU 限制很远 - 而当有两个进程时它的运行速度是原来的两倍,这一事实证实了这一点。跨度>
    • 我想这是有道理的。我的理由是,既然他说 4 线程工作正常,但任何其他线程都会降低性能,而且由于四核非常流行,这似乎是造成麻烦的可能原因.但越想越觉得没有道理..
    • 我们正要迁移到四核,但在双核上,我们真正发现了 4 个请求的“限制”。 CPU 在这个进程上运行大约 1-2%,网络也是如此(根据任务管理器),所以这些似乎都不是问题......
    猜你喜欢
    • 2017-01-15
    • 1970-01-01
    • 2011-12-11
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多