6

我正在做一个网络爬虫并使用线程来下载页面。

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

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

4

4 回答 4

0

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

在一定数量的线程之后,性能确实会下降。但这也取决于您抓取的站点,您使用的操作系统等。尝试找到一个响应时间仅恒定的站点来执行您的第一个基准测试(例如 Google,但采用不同的服务)

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

于 2011-05-19T22:25:02.573 回答
0

看看我在这个线程中的答案

如何找出最佳线程数?

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

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

于 2011-05-20T15:31:06.540 回答
0

理想的线程数应接近硬件提供的内核数(虚拟内核)。这是为了避免线程上下文切换和线程调度。如果您正在使用许多阻塞读取(您的线程阻塞套接字读取)进行繁重的 IO 操作,我建议您重新设计代码以使用非阻塞 IO API。通常,这将涉及一个“选择器”线程,该线程将监视数千个套接字的活动,以及一小部分将执行处理的工作线程。如果你的代码是用 Java 编写的,那么 API 就是 NIO。唯一的阻塞调用将在您调用时进行selector.select(),并且只有在数千个套接字中的任何一个都没有要处理的内容时才会阻塞。事件驱动的框架,例如 netty。

于 2016-11-30T13:17:14.743 回答
-2

我说使用 Akka 之类的东西为你管理线程。如果我没记错的话,使用带有非阻塞 IO 的 Jersey http 客户端库,它可以与回调一起使用。它可能是此类任务的理想设置。

于 2011-05-20T01:19:40.713 回答