在多核群集节点上并行运行Java应用程序

时间:2015-06-07 14:32:17

标签: java multithreading concurrency parallel-processing

我有一个Java程序,可以计算两个文档之间的语义相似性。程序从指定的文件系统中检索文档并计算相似性。大约有2,00,000个这样的文档 我为此任务创建了10个线程,并为每个线程分配了数据卡盘。对于前者文件1-20000为第一个线程,20001-40000为下一个线程,依此类推 目前我在8 CPU核心机器上运行上述程序。它花了很多时间来完成计算 我想在5节点Linux集群上运行该程序,其中每个节点有64个核心。

  • Java中是否有像EXECUTOR Framework这样可以执行此任务的框架?
  • 有没有办法计算一个人可以产生的最大线程数?
    任何关于如何解决这个问题或做得更好的指示都将不胜感激。

2 个答案:

答案 0 :(得分:4)

Java中是否有像EXECUTOR Framework这样可以执行此任务的框架?

我建议你看一下Akka framework来写强大的并发&分布式应用。 Akka将Actor模型与软件事务内存一起使用,以提高抽象级别,并为构建正确的并发和可伸缩应用程序提供更好的平台。

逐步了解tutorial,它提供了有关如何使用Akka框架构建分布式应用程序的更多信息。

通常,分布式应用程序使用Java-RMI在Java中构建,内部使用Java的内置序列化在节点之间传递对象。

有没有办法计算一个人可以产生的最大线程数?

我们使用的简单规则是,设置为高于系统中可用逻辑核心的值。价值多高取决于我们的运营类型。例如,如果计算涉及IO通信,则将线程数设置为2 *个可用逻辑核(不是物理核)。

我们使用的其他想法,

  • 通过逐个增加线程数来衡量CPU利用率,并在CPU利用率接近90-100%时停止
  • 测量吞吐量并停止吞吐量停留或开始降低的点

答案 1 :(得分:0)

Java Fork/Join framework是你的朋友。正如该框架的开场陈述所说:

  

fork / join框架是ExecutorService的一个实现   界面,可以帮助您利用多个处理器。它是   专为工作而设计,可以递归地分成小块。   目标是使用所有可用的处理能力来增强   你的申请表现。

关于你可以产生多少线程 - 我认为没有这样的硬性和快速的规则,这取决于。所以可以尝试从5左右的数字开始,然后根据结果继续增加或减少 此外,您可以分析现有的最大和最小线程数,并将其与CPU利用率等进行对比,并按此操作以了解系统的行为方式。如果您的应用程序部署在应用程序服务器中,请检查其线程模型以及它们对线程容量的看法。