【问题标题】:Number of CPU cores for parallel stream Java 8并行流 Java 8 的 CPU 内核数
【发布时间】:2019-02-05 14:58:14
【问题描述】:

我有以下来自 VM 之一的输出。

因此,根据link,并行流使用默认的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

【问题讨论】:

  • 不太确定问题是什么。这就是为什么你得到1作为输出而处理器数量是4的原因吗?目前问题中涉及的流在哪里?
  • @nullpointer 流确实没用,但我真的想知道这是否是真的运行Runtime.getRuntime().availableProcessors()lscpu 时OP 的样子...
  • 会不会是您在 VM 中运行 Runtime.getRuntime().availableProcessors() 而在主机系统(不是 VM)中运行 lscpu
  • @Eugene 是的,这就是让我不清楚这个问题的原因。
  • @KarolDowbecki 正是我的想法……可能涉及到 docker 吗?

标签: java java-8 parallel-processing java-stream cpu


【解决方案1】:

当您的lscpu 命令在主机上运行时,您很可能在 vCPU 数量有限的 VM 内或受控制组 (cgroups) 限制的容器中运行 Java 代码。

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

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

【讨论】:

  • 我的应用在 pcf 容器中运行。
猜你喜欢
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多