我正在运行多线程的C#控制台应用程序。核心进程检索一些要处理的数据,将其分割成可配置数量的较小数据集,然后生成相同数量的线程来处理每个数据子集。多线程WebRequest调用和争用
要处理单个记录,线程必须使用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个线程,我们的表观开销 发送数据和检索围绕 第二所述 响应流的平均值。
- 当我们运行4个以上的线程时, 的平均值上升,最大值为 遇到了几十秒!
今天我能够运行两个单独的进程,每个进程运行4个线程(但基本上确保每个线程仍在唯一数据上运行)。这一次,我们的整体吞吐量几乎翻了一番,每个过程都有稳定的时间约一秒。
这使我相信我们正在对WebRequest类的资源造成某种限制;但它是一个每个进程的限制,而不是一个机器限制。我知道我们可以使用BeginGetRequestStream和BeginGetResponse异步调用我们的调用,但是我怀疑如果我们实际上遇到某种资源限制,它会产生积极影响?!
我应该看看如何让单个流程中的拆分次数不会减少,从而降低性能?
感谢您的细节。 – 2009-09-24 19:59:17