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

时间:2011-05-19 22:07:06

标签: java multithreading performance metric

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

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

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

4 个答案:

答案 0 :(得分:0)

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

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

由于网站速度较慢,线程数量较多,可以弥补i / o阻塞

答案 1 :(得分:0)

在这个帖子中查看我的答案

How to find out the optimal amount of threads?

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:-2)

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