Java 8中用于并行流的CPU核心数

5

我有一个VM的输出结果。

根据链接,并行流使用默认的ForkJoinPool.commonPool,这个池子默认会比你拥有的处理器少一个线程,通过Runtime.getRuntime().availableProcessors()返回。

如果我运行Runtime.getRuntime().availableProcessors(),它总是返回1,但是查看下面的输出,数字应该更多。 我错过了什么吗?

lscpu命令的输出如下:

2019-02-05T20:20:33.813+05:30 [APP/PROC/WEB/0] [OUT] Architecture: x86_64
2019-02-05T20:20:33.813+05:30 [APP/PROC/WEB/0] [OUT] CPU op-mode(s): 32-bit, 64-bit
2019-02-05T20:20:33.813+05:30 [APP/PROC/WEB/0] [OUT] Byte Order: Little Endian
2019-02-05T20:20:33.813+05:30 [APP/PROC/WEB/0] [OUT] CPU(s): 4
2019-02-05T20:20:33.813+05:30 [APP/PROC/WEB/0] [OUT] On-line CPU(s) list: 0-3
2019-02-05T20:20:33.814+05:30 [APP/PROC/WEB/0] [OUT] Thread(s) per core: 1
2019-02-05T20:20:33.814+05:30 [APP/PROC/WEB/0] [OUT] Core(s) per socket: 1
2019-02-05T20:20:33.819+05:30 [APP/PROC/WEB/0] [OUT] Socket(s): 4
2019-02-05T20:20:33.819+05:30 [APP/PROC/WEB/0] [OUT] NUMA node(s): 1
2019-02-05T20:20:33.819+05:30 [APP/PROC/WEB/0] [OUT] Vendor ID: GenuineIntel
2019-02-05T20:20:33.819+05:30 [APP/PROC/WEB/0] [OUT] CPU family: 6
2019-02-05T20:20:33.819+05:30 [APP/PROC/WEB/0] [OUT] Model: 58
2019-02-05T20:20:33.819+05:30 [APP/PROC/WEB/0] [OUT] Stepping: 0
2019-02-05T20:20:33.820+05:30 [APP/PROC/WEB/0] [OUT] CPU MHz: 2599.998
2019-02-05T20:20:33.820+05:30 [APP/PROC/WEB/0] [OUT] BogoMIPS: 5199.99
2019-02-05T20:20:33.820+05:30 [APP/PROC/WEB/0] [OUT] Hypervisor vendor: VMware
2019-02-05T20:20:33.820+05:30 [APP/PROC/WEB/0] [OUT] Virtualization type: full
2019-02-05T20:20:33.820+05:30 [APP/PROC/WEB/0] [OUT] L1d cache: 32K
2019-02-05T20:20:33.820+05:30 [APP/PROC/WEB/0] [OUT] L1i cache: 32K
2019-02-05T20:20:33.821+05:30 [APP/PROC/WEB/0] [OUT] L2 cache: 256K
2019-02-05T20:20:33.821+05:30 [APP/PROC/WEB/0] [OUT] L3 cache: 40960K

不太确定问题是什么。你的问题是为什么在处理器数量为4时输出为1?而当前问题中涉及到哪些流? - Naman
2
@nullpointer 流确实没什么用,但我真的很想知道当运行 Runtime.getRuntime().availableProcessors()lscpu 时,这是否是 OP 真正想要的... - Eugene
4
你是不是在虚拟机中运行了 Runtime.getRuntime().availableProcessors(),而在宿主系统(非虚拟机)中运行了 lscpu 命令? - Karol Dowbecki
1
@Eugene 确实,这就是让我感到困惑的问题所在。 - Naman
抱歉问题不太清楚:我在PCF上部署了一个应用程序,在该应用程序中,我正在尝试从“Runtime.getRuntime().availableProcessors()”中找出核心数。我在同一应用程序中再次以编程方式执行了lscpu,例如“Runtime.getRuntime().exec(command);”,并传递的命令是lscpu。 - Rahul Singh
显示剩余3条评论
1个回答

7

您很可能在使用具有有限vCPU数量的虚拟机或受控制组(cgroups)限制的容器中运行Java代码,而lscpu命令是在主机上运行的。

除非您的JVM受到错误的影响(例如JDK-8188310JDK-6515172),否则这些数字应该是相同的。

请注意,Java 10根据Docker容器的Java改进改进了资源管理,并引入了-XX:ActiveProcessorCount选项。您当前正在使用的Java 8肯定无法正确处理所有边缘情况。


我的应用正在 PCF 容器内运行。 - Rahul Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接