在我们的 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
在 Windows 上的 Netbeans IDE 中使用 64 位 Java 8 编译器编译。制作了一个可执行的jar。 运行 jar,如下所示:
java -jar NoOfCPUs.jar
相同的系统环境变量 NUMBER_OF_PROCESSORS 向我展示了来自命令提示符与来自 Java 程序的不同结果。
为什么?
难道是Windows 2009版本以后使用逻辑处理器组的原因?逻辑处理器组在一个组中最多包含 64 个处理器。
最佳答案
这似乎与以下其他问题有关:
并且这个错误报告说它不会被支持(不会修复):
https://bugs.openjdk.java.net/browse/JDK-6942632
错误报告说用户应该负责为 Java 配置正确数量的 CPU,这可以通过:
- https://bitsum.com/portfolio/groupextend/
- 可能是其他的,因为类似 start/affinity 的亲和性继承,参见 this answer但我无法测试/确认,因为我的笔记本电脑没有那么多内核
我认为你应该考虑运行你的应用程序(和 Java)的多个实例而不是仅仅一个以获得最大性能,因为 NUMA 局部性,尽管不同的 Java 虚拟机有 support for NUMA它仍然可能存在可伸缩性问题,具体取决于配置的垃圾收集算法(非并发,因此是 Stop-the-World),请参阅:Amdahls Law
如果该限制特定于 HotSpotVM(源自 Sun/Oracle),您可能需要查看不同的 Java 虚拟机 OpenJ9(源自 IBM)和其他类似 Azul Zing JVM 的虚拟机
如果这是 Windows 特定的限制,您可能需要考虑切换到不同的操作系统或通过您选择的管理程序运行多个 Windows 实例。
关于java - Windows 环境变量 NUMBER_OF_PROCESSORS 在 JVM 内外显示不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61680519/