2

我有一个要在超级计算机上运行的 .jar 文件。有大约 40 个 CPU 节点可用,但 Java 在运行我的程序时只使用其中一个。有没有办法告诉 Java 使用所有可用的节点来运行给定的程序(最好不重新编译程序)?

4

1 回答 1

2

默认情况下,Java 总是使用所有可用的 CPU。默认情况下,当您启动它时,它会为每个逻辑 CPU 创建一个线程,仅用于执行 GC。

有大约 40 个 CPU 节点可用,但 Java 在运行我的程序时只使用其中一个

问题是您的程序只使用了三分之一,因为这就是您编写程序的方式。如果您希望您的程序使用更多 CPU,您将必须在程序中执行更多独立任务,以便它可以利用更多 CPU。

有没有办法告诉 Java 使用所有可用的节点来运行给定的程序

是的,但你必须在你的代码中这样做,否则它不会神奇地使用比你的程序告诉它更多的 CPU。

我猜是JRE的错。

要么是 20 年前发布的 JRE 有一个错误会停止多线程工作,而且当时没有人修复它,即使大约有 1000 万开发人员使用它,或者你刚刚编写的只有一个人使用的程序有错误在里面。哪个听起来更有可能有错误?

如果您想查看是否可以使用机器上的所有 CPU。

public class Main {
    public static void main(String[] args) {
        IntStream.range(0, 1000).parallel().forEach(i -> {
            long end = System.currentTimeMillis() + 1000;
            while (end > System.currentTimeMillis()) {
                // busy wait
            }
            System.out.println("task " + i + " finished");
        });
    }
}

这将使用您机器上的所有逻辑 CPU,而无需任何特殊选项。

我已经看到在生产环境中运行在具有 120 个 CPU 和 3 TB 主内存的服务器上运行良好的 Java。当您的 Java 程序使用多个 NUMA 区域时,您会遇到一些问题,但我怀疑这是您的问题。

于 2015-09-22T15:00:42.720 回答