Java Threadpool大小和availableProcessors()

我有一个并行运行(全天)任务的程序(要执行的任务中没有I / O)所以我使用了Executors.newFixedThreadPool(poolSize)来实现它。

最初我将poolSize设置为Runtime.getRuntime().availableProcessors() ,但我有点担心使用所有可用内核,因为在同一台PC上运行其他进程(32个内核)。

特别是我有十个其他JVM运行相同的程序(在不同的输入数据上),所以我有点担心在可用内核之间的线程切换方面可能会有很多开销,这可能会减慢整体计算速度。

如何确定每个程序/ JVM的池大小?

此外,在我的PC中,还有其他进程一直在运行(防病毒,备份等)。 我也应该考虑这些吗?

任何建议都将取决于您的具体情况。 32个核心上的10个JVM将建议每个3个线程(忽略垃圾收集线程,计时器任务等…)

您还有其他任务正在运行。 调度程序将确保它们正在运行,但它们是否必须响应? 比JVM响应更快? 如果您正在运行Linux / Unix,那么您还可以使用优先级(通过nice )来确保特定进程不会占用CPU。

最后你运行了10个JVM。 会导致分页吗? 如果是这样,那将会很慢,为了避免消耗这么多内存,你最好少运行更少的JVM。

只需确保您的关键变量是公开和可配置的,并测量各种方案以找到最佳方案。

如何确定每个程序/ JVM的池大小?

您需要的线程数将使您获得接近99%的利用率,而不是更多。

平衡工作的最简单方法是让进程运行一次,同时处理多个文件并只使用一个线程池。 如果需要通过命令行启动文件,可以将进程设置为服务。

如果出于某种原因这是不可能的,那么您需要猜测线程池应该缩减多少。 尝试运行一个进程并查看利用率。 如果一个人说40%,那么我怀疑十个过程被400%过度使用。 也就是说,你可以将池大小减少4倍。

不幸的是,这很难知道,因为程序通常不知道在同一个盒子上还有什么或者可能会发生什么。

“简单”的出路是使池大小可配置。 这允许控制程序/框的用户决定分配给程序的线程数(可能使用他们对框的一般工作负载的了解)。

更复杂的解决方案是尝试以编程方式确定框的当前工作负载,并从中适当选择池大小。 此解决方案的功效取决于您确定工作负载的准确程度,并可能随着时间的推移而变化。

尝试点击进程,检查top /任务管理器和性能监视器,以validation此实现是否实际影响了您的计算机。

本文似乎包含有关您要实现的内容的有趣信息: http : //www.ibm.com/developerworks/library/j-jtp0730/index.html