【发布时间】:2017-06-20 07:42:29
【问题描述】:
我需要在批处理程序中获得理想数量的线程,该程序在支持并行模式的批处理框架中运行,例如 Spring Batch 中的并行步骤。
据我所知,一个程序的执行步骤过多的线程是不好的,可能会对程序的性能产生负面影响。某些因素可能会导致性能下降(上下文切换、使用共享资源时的竞争条件(锁定、同步..)...(还有其他因素吗?))。
当然,获得理想线程数的最佳方法是让实际程序测试调整程序的线程数。但是在我的情况下,进行实际测试并不容易,因为测试需要很多东西(人员,测试计划,测试数据等),我现在很难准备。因此,在进行实际测试之前,我想尽可能地了解如何让我的程序获得可猜测的理想线程数。 我应该考虑什么来获得我的程序的理想线程数(步骤)? CPU核心数??我的程序将在其上运行的机器上的进程数?数据库连接数?? 在这种情况下,有公式之类的合理方式吗?
【问题讨论】:
-
通常
Runtime.getRuntime().availableProcessors();就足够了。 -
最重要的考虑是您的应用程序/计算是否受 CPU 限制或 IO 限制。如果它是 IO 绑定的(单个线程大部分时间都在等待外部资源,例如数据库连接、文件系统或其他外部数据源),那么您可以分配(许多)比可用处理器数量更多的线程 -当然,有多少也取决于外部资源的扩展程度——本地文件系统,可能不是那么大。如果它(大部分)受 CPU 限制,那么稍微超过可用处理器的数量可能是最好的。
-
@Erwin 我会赞成这个。将其发布为答案。
标签: java multithreading performance spring-batch