3

在我们的 Windows Server 2019 上,我们有 36 个内核和 72 个逻辑处理器,如任务管理器 CPU 性能窗口所示。而且,如果我从命令提示符运行命令。

echo %NUMBER_OF_PROCESSORS%

它告诉我72。

但是,在 Java 程序中,如果我运行以下代码片段,

public class NoOfCPUs {  
    public static void main(String[] args) {
        String envName = "NUMBER_OF_PROCESSORS";
        String noOfP = System.getenv(envName);
        System.out.format("%s (from env) = %s%n", envName, noOfP);
    }
}

输出如下:

NUMBER_OF_PROCESSORS (from env) = 36

在 Netbeans IDE 的 Windows 上使用 64 位 Java 8 编译器编译。制作了一个可执行的jar。运行罐子,如:

java -jar NoOfCPUs.jar

相同的系统环境变量,NUMBER_OF_PROCESSORS 向我显示命令提示符与 Java 程序中的不同结果。

为什么?

是不是因为 Windows 2009 版本之后使用的逻辑处理器组?逻辑处理器组在一个组中最多可容纳 64 个处理器。

4

1 回答 1

2

这似乎与以下其他问题有关:

并且此错误报告说它将不受支持(不会修复):

https://bugs.openjdk.java.net/browse/JDK-6942632

错误报告说,用户有责任为 Java 配置适量的 CPU,这可以通过以下方式实现:

  1. https://bitsum.com/portfolio/groupextend/
  2. 可能是其他的,因为像 start /affinity 这样的亲和力继承,看到这个答案,但我无法测试/确认,因为我的笔记本电脑没有那么多内核

我认为您应该考虑运行应用程序(和 Java)的多个实例,而不是只运行一个,因为 NUMA 局部性无论如何都可以获得最大性能,尽管不同的 Java 虚拟机支持 NUMA,但根据配置的垃圾收集,它仍然可能存在可伸缩性问题算法(非并发,因此停止世界)参见:Amdahls Law

如果限制特定于 HotSpotVM(源自 Sun/Oracle),您可能需要查看不同的 Java 虚拟机 OpenJ9(源自 IBM)和Azul Zing JVM等其他虚拟机

如果这是 Windows 特定的限制,您可能需要考虑切换到不同的操作系统或通过您选择的虚拟机管理程序运行多个 Windows 实例。

于 2020-05-08T15:02:38.947 回答