【问题标题】:How to get an ideal number of threads in parallel programs in Java?如何在 Java 的并行程序中获得理想数量的线程?
【发布时间】:2017-06-20 07:42:29
【问题描述】:

我需要在批处理程序中获得理想数量的线程,该程序在支持并行模式的批处理框架中运行,例如 Spring Batch 中的并行步骤。

据我所知,一个程序的执行步骤过多的线程是不好的,可能会对程序的性能产生负面影响。某些因素可能会导致性能下降(上下文切换、使用共享资源时的竞争条件(锁定、同步..)...(还有其他因素吗?))。

当然,获得理想线程数的最佳方法是让实际程序测试调整程序的线程数。但是在我的情况下,进行实际测试并不容易,因为测试需要很多东西(人员,测试计划,测试数据等),我现在很难准备。因此,在进行实际测试之前,我想尽可能地了解如何让我的程序获得可猜测的理想线程数。 我应该考虑什么来获得我的程序的理想线程数(步骤)? CPU核心数??我的程序将在其上运行的机器上的进程数?数据库连接数?? 在这种情况下,有公式之类的合理方式吗?

【问题讨论】:

  • 通常Runtime.getRuntime().availableProcessors(); 就足够了。
  • 最重要的考虑是您的应用程序/计算是否受 CPU 限制或 IO 限制。如果它是 IO 绑定的(单个线程大部分时间都在等待外部资源,例如数据库连接、文件系统或其他外部数据源),那么您可以分配(许多)比可用处理器数量更多的线程 -当然,有多少也取决于外部资源的扩展程度——本地文件系统,可能不是那么大。如果它(大部分)受 CPU 限制,那么稍微超过可用处理器的数量可能是最好的。
  • @Erwin 我会赞成这个。将其发布为答案。

标签: java multithreading performance spring-batch


【解决方案1】:

最重要的考虑因素是您的应用程序/计算是否受 CPU 限制或 IO 限制。

  • 如果它是 IO 绑定的(单个线程大部分时间都在等待外部资源,例如数据库连接、文件系统或其他外部数据源),那么您可以分配(许多)比线程数更多的线程可用的处理器 - 当然有多少也取决于外部资源的扩展程度 - 本地文件系统,可能不太可能。
  • 如果它(大部分)受 CPU 限制,则略高于 可用的处理器可能是最好的。

【讨论】:

  • 感谢您的好回答。但我还有一个关于它的问题。正如您所说,将可用处理器的数量设置为程序的线程数可能是受 CPU 限制的最佳方式。如果在我将运行我的程序的同一台机器上运行许多其他程序,这仍然有效吗?我说的是 CPU 的工作原理。我认为 CPU 已经很忙,没有运行我的程序。
  • @thatsyou:无论如何,不​​要浪费时间去想那些你无法控制的事情。关键是,线程数少于内核数意味着您永远无法使用所有内核。拥有比(可用)内核更多的线程,仅意味着线程必须共享内核。除非我们谈论的是每个内核有数百或数千个线程,否则调度开销可以忽略不计。
【解决方案2】:

一般方程:

线程数

其中 0

机器核心数:Runtime.getRuntime().availableProcessors()

您可以并行的线程数,您将通过打印此代码获得:

ForkJoinPool.commonPool()

并且数量并行度是您机器的核心数量 - 1。因为那个是用于主线程的。

Source link

时间:1:09:00

【讨论】:

  • 这里的阻塞因子是什么或者你如何计算它?
【解决方案3】:

我应该考虑什么来获得我的程序的理想线程数(步数)? CPU核心数??我的程序将在其上运行的机器上的进程数?数据库连接数??在这种情况下有公式之类的合理方式吗?

如果没有大量关于您正在线程化的实际代码的知识,这将是非常困难的。正如@Erwin 所提到的,IO 与 CPU 绑定操作是在确定线程化应用程序是否会产生任何改进之前需要的关键知识。即使您确实找到了特定硬件的最佳位置,您也可能在另一台服务器(或虚拟云节点的不同实例)上启动并看到截然不同的性能数据。

要考虑的一件事是在运行时更改线程数。 ThreadPoolExecutor.setCorePoolSize(...) 设计为在线程池运行后调用。您可以公开一些 JMX 挂钩来手动为您执行此操作。

您还可以允许您的应用程序在运行时监控应用程序或系统 CPU 使用情况,并根据该反馈调整值。您还可以保留AtomicLong 吞吐量计数器,并在运行时上下拨动线程以尝试最大化吞吐量。然而,要做到这一点可能会很棘手。

我通常会尝试:

  • 对线程号做出最佳猜测
  • 检测您的应用程序,以便确定不同线程数的效果
  • 允许在运行时通过 JMX 对其进行调整,以便我可以看到效果
  • 确保线程数是可配置的(可能通过系统属性),这样您就不必重新发布来尝试不同的线程数

【讨论】:

    猜你喜欢
    • 2011-04-16
    • 2014-07-02
    • 1970-01-01
    • 2017-09-28
    • 2021-01-31
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 2010-09-07
    相关资源
    最近更新 更多