我正在开发一项新服务,为我们公司的多个网站属性运行QA,并遇到了一个有趣的网络并发问题。为了提高性能,我使用TPL从大量url创建HttpWebRequests,以便它们可以并行运行;但是,我似乎无法找到这个过程中的瓶颈所在。
到目前为止我的观察结果:
可能的痛点:
所以问题是:
显然现在可以在几分钟内下载整个互联网,但我很想知道在这样的情况下瓶颈在哪里以及可以采取什么措施来克服它。
作为旁注,我们目前正在使用第三方服务进行抓取,但我们在某些方面受到限制,并希望获得更大的灵活性。关于企业秘密酱或poison on the tip of the arrow ... :)的一些事情。
答案 0 :(得分:7)
我强烈怀疑以下原因之一是:
TPL不保证您有任何最低并行度(DOP)。这很遗憾,因为有时你真的需要在使用IO时完全控制并行度。
我建议您手动启动固定数量的线程来执行IO,因为这是保证特定DOP的唯一方法。您需要尝试确切的值。它可以在50到500的范围内。您可以减少线程的默认堆栈大小,以便用这么多线程节省内存。
答案 1 :(得分:1)
也许您正在达到TCP连接限制,或者没有正确处理连接,在任何情况下都尝试使用JMeter之类的东西来查看可以获得的最大并发HTTP吞吐量。
答案 2 :(得分:1)
代码非常简单。我使用Parallel.ForEach循环 一组URL(字符串)。该操作创建了一个HttpWebRequest 然后将结果转储到ConcurrentBag中。 BTW,NCrawler似乎 有趣;我会检查一下。谢谢你的提示。
因为使用Parallel.ForEach无法控制线程数,所以我建议至少切换到ThreadPool
。
您可以使用QueueUserWorkItem
分配工作,直到您的任务集合完全推送到工作线程或者方法返回false(池中没有线程)。
使用ThreadPool
,您可以控制使用SetMaxThreads
分配的最大线程数。