2011-05-19 142 views
5

我正在做一个web爬行器,并使用线程来下载页面。有没有办法确定理想的线程数量?

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

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

+2

如果您的应用程序受CPU限制,则该数字非常接近您机器上的CPU数量。但是,I/O绑定程序(如网络爬虫)最终会阻止I/O,所以您可能会拥有更多。因此,我必须同意@ pst的评论:运行测试,然后找出适合您环境的理想数字。在代码中检测这个并不是一个好方法。 (但是,一旦您知道如何检查“当前平均”带宽,您就可以编写自调整代码。) – 2011-05-19 22:20:05

回答

0

我们开发了一个多线程平行网络爬虫。基准测试结果是了解野兽如何处理他的工作的最佳方式。对于一个专用的java服务器,每个内核有一个线程是启动的基础,然后I/O进入并发生变化。

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

随着慢速网站,更多的线程倾向于补偿I/O阻塞

+0

在完成整个程序并运行测试后,我将准备一个脚本。 – 2011-05-24 14:52:19

-2

我说使用类似Akka的东西管理你的线程。如果我没有记错的话,请使用带有非阻塞IO的Jersey http客户端库,并使用回调。这可能是这类任务的理想设置。

0

在这个线程看看我的回答

How to find out the optimal amount of threads?

你的例子可能会被CPU绑定,所以你需要一种方法来制定出争才能够制定出正确的号码线上您的箱子使用,并能够保持他们都忙。性能分析将帮助那里,但记住它取决于内核数量(以及已经提到的网络延迟等),所以使用运行时获得线程池大小的内核数量。

没有快速回答恐怕会出现测试,测量,调整,重复的元素恐怕!

0

理想的线程数应该接近硬件提供的核心数量(虚拟核心数量)。这是为了避免线程上下文切换和线程调度。如果你正在做大量的IO操作,并且有很多阻塞读取(你的线程块在套接字上读取),我建议你重新设计你的代码来使用非阻塞IO API。通常,这将涉及一个“选择器”线程,该线程将监视数千个套接字的活动以及将执行处理的少量工作线程。如果你的代码是Java,那么API是NIO。当您拨打selector.select()时,唯一阻止呼叫将会是,并且只有在数千个套接字中没有任何内容需要处理时才会阻止。像netty.io这样的事件驱动框架使用这种模式,并且已被证明是非常具有伸缩性的,并能最好地利用系统的硬件资源。

相关问题