考虑性能和高效核心的池中线程数

问题描述 投票:0回答:1

对于 CPU 密集型工作的线程池中的多个线程的一般建议是,逻辑 CPU 最多有一个线程。在 JVM 上,使用

Runtime.getRuntime().availableProcessors()
是一种常见的做法,这也在 Scala 执行上下文和任务支持中使用来确定默认的并发级别,请参阅:

private[parallel] final class FutureTasks(executor: ExecutionContext) extends Tasks {
  //....
  def parallelismLevel = Runtime.getRuntime.availableProcessors
}

最近一些CPU引入了高效和性能核心的概念。这会以任何方式改变建议吗?在最大化 CPU 密集型任务的吞吐量时,利用所有核心(包括高效核心)被认为对性能有利,还是线程池应该仅限于性能核心?是否有任何 API 允许应用程序像这样查询异构 CPU 配置?

我最感兴趣的是 JVM,但 Windows、Linux 或 MacOS 的本机 API 也可能很有趣。我对如何检测 Intel Alder Lake CPU 中的 P/E-Core? 中讨论的线程控制不感兴趣,只对类似于

availableProcessors
的一般系统功能信息感兴趣,但包括有关非统一架构的一些详细信息.

java multithreading scala operating-system jvm
1个回答
0
投票

你问了很多问题,但你是从这个开始的:

对于 CPU 密集型工作的线程池中的多个线程的一般建议是,逻辑 CPU 最多有一个线程。在 JVM 上,常见的做法是使用

Runtime.getRuntime().availableProcessors()
...

  1. 您所说的“一般建议”只是一个经验法则。更好的建议是调整要优化的线程数量...无论您要优化什么。

  2. 事实上,我不相信使用这样的代码是“常见做法”。事实上,我怀疑更常见的是在配置文件中指定线程数,或者(就像公共线程池的情况)让 JVM 决定,无论它如何决定。

最近一些CPU引入了高效和性能核心的概念。这会以任何方式改变建议吗?

嗯......你必须咨询给你建议的人或网站。

但是一般来说我不会影响我给出的建议。

一般来说,有很多因素会影响应用程序的吞吐量。例如,应用程序的性质与线程数量同样重要;例如

  • Java 线程做什么?
  • 他们如何互动?
  • 它们如何与记忆相互作用?
  • 如何与操作系统和/或外部服务交互?

实际上,有太多因素难以量化,任何经验法则都行不通。

在最大化 CPU 密集型任务的吞吐量时,利用所有核心(包括高效核心)被认为对性能有利,还是线程池应该仅限于性能核心?

我不知道是否有人尝试过对 Java 应用程序进行理论上的建模或经验上的测量。但考虑到为我们提供“每个核心一个线程”的建模的简单性,我怀疑人们能否提出一个具有“预测性”的理论或经验模型。

是否有任何 API 允许应用程序像这样查询异构 CPU 配置?

据我所知。

而且我不确定您是否能够在 Java 应用程序中充分利用这些信息。

© www.soinside.com 2019 - 2024. All rights reserved.