有没有办法确定理想的线程数?

我正在做一个webcrawler并使用线程下载页面。

我的程序性能的第一个限制因素是带宽,我永远无法下载它可以获得的更多页面。

第二件事是我感兴趣的。 我正在使用线程同时下载许多页面,但是当我创建更multithreading时,会发生更多的处理器共享。 是否有一些度量/方式/类测试来确定什么是理想的线程数,或者如果在一定数量之后,性能不会改变或减少?

我们开发了一个multithreading并行网络爬虫。 对吞吐量进行基准测试是了解野兽如何处理其工作的最佳方式。 对于专用的Java服务器,每个核心一个线程是启动的基础,然后I / O开始发挥作用并进行更改。

在一定数量的线程之后,性能会降低。 但这取决于你抓取的网站,你使用的操作系统等等。尝试找到一个只有不断响应时间的网站来做你的第一个基准测试(比如谷歌,但采取不同的服务)

对于速度较慢的网站,较多的线程往往会补偿i / o阻塞

看看我在这个post中的答案

如何找出最佳线程数量?

您的示例可能受CPU限制,因此您需要一种方法来解决争用,以便能够计算出您的盒子上正确数量的线程,并能够让它们保持忙碌状态。 分析将有助于那里,但记住它将取决于核心的数量(以及已经提到的网络延迟等),因此在连接线程池大小时使用运行时来获取核心数。

没有快速回答我害怕,会有一个测试,测量,调整,重复的元素我害怕!

理想的线程数应该接近硬件提供的核心(虚拟核心)数量。 这是为了避免线程上下文切换和线程调度。 如果您正在使用许多阻塞读取(读取套接字上的线程块)进行繁重的IO操作,我建议您重新设计代码以使用非阻塞IO API。 通常,这将涉及一个“选择器”线程,它将监视数千个套接字的活动以及将执行处理的少量工作线程。 如果您的代码是Java,则API是NIO。 唯一的阻塞调用是当你调用selector.select() ,只有在数千个套接字中没有任何东西需要处理时它才会阻塞。 事件驱动的框架(如netty.io)使用此模型,并且已经certificate具有很高的可扩展性,可以最好地利用系统的硬件资源。

我说使用像Akka这样的东西为你管理线程。 使用Jersey http client lib和非阻塞IO,如果我没记错的话可以使用回调。 它可能是这类任务的理想设置。