我正在运行一个多线程的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个以上的线程时,整个流程的吞吐量不会提高,在某些情况下甚至会下降。来自Web服务的计时数据保持其性能保持不变。
发送数据并检索
响应流的平均值约为
第二。
平均上升与最大值
遇到几十秒!
今天,我能够运行两个单独的进程,每个进程运行4个线程(但实际上确保了每个线程仍在唯一数据上运行)。这次,我们的总体吞吐量几乎翻了一番,每个过程的稳定时间约为一秒钟。
这使我相信,相对于WebRequest类,我们在资源上遇到了某种限制。但这是每个进程的限制,而不是机器的限制。我知道我们可以使用BeginGetRequestStream和BeginGetResponse异步进行调用,但是我怀疑如果我们实际上达到某种资源限制会产生积极的影响?
我应该怎么看才能使我们在不降低性能的情况下增加单个流程中的拆分数量?
最佳答案
您需要增加可以向单个主机发出的并发Web请求的数量-否则,尽管有大量CPU可用,但是线程基本上将互相等待完成。最简单的方法是使用<connectionManagement>
的app.config
元素:
<configuration>
<system.net>
<connectionManagement>
<add address = "*" maxconnection = "100" />
</connectionManagement>
</system.net>
</configuration>