【问题标题】:Is there a way to determine the ideal number of threads? [duplicate]有没有办法确定理想的线程数? [复制]
【发布时间】:2011-05-19 22:07:05
【问题描述】:

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

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

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

【问题讨论】:

  • 如果您的应用程序受 CPU 限制,那么该数量非常接近您计算机上的 CPU 数量。但是,I/O 绑定程序(如网络爬虫)最终会大量阻塞 I/O,因此您可能会拥有更多。因此,我必须同意@pst 的评论:运行测试,然后找出适合您环境的理想数字。没有一种很好的方法可以在代码中检测到这一点。 (但是,一旦您知道如何检查“当前平均”带宽,您就可以编写自调整代码。)

标签: java multithreading performance metric


【解决方案1】:

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

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

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

【讨论】:

  • 整个程序完成后我会准备一个脚本并运行测试。
【解决方案2】:

看看我在这个帖子里的回答

How to find out the optimal amount of threads?

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-27
        • 2012-04-17
        • 2020-12-27
        • 2019-11-08
        相关资源
        最近更新 更多