每个处理器的线程数

2022-09-01 15:20:38

在Java中,是否有一种编程方法来找出CPU支持多少个并发线程?

更新

为了澄清,我不是试图用线程来锤击CPU,我知道Runst.getRuntime().availableProcessors()函数,它为我提供了我正在寻找的部分信息。

我想找出是否有办法自动调整线程池的大小,以便:

  • 如果我在 1 年机龄的服务器上运行,我会得到 2 个线程(每个 CPU 1 个线程 x 任意乘数 2)
  • 如果我在两年后切换到英特尔 i7 四核(每个内核支持 2 个线程),我将获得 16 个线程(每个 CPU 2 个逻辑线程 x 4 个 CPU x 2 的任意乘数 2)。
  • 相反,如果我使用八核Ultrasparc T2服务器(每个核心支持8个线程),我得到128个线程(每个CPU 8个线程x 8个CPU x 2的任意乘数)
  • 如果我在30台不同机器的集群上部署相同的软件,这些机器可能是在不同年份购买的,我不需要阅读CPU规格并为其中的每一台机器设置配置选项。

答案 1

Runtime.availableProcessors 返回逻辑处理器(即硬件线程)的数量,而不是物理内核的数量。请参阅 CR 5048379


答案 2

单个非超线程 CPU 内核始终可以运行一个线程。您可以生成许多线程,CPU将在它们之间切换。

最佳数字取决于任务。如果这是一项需要大量CPU功率并且不需要任何I / O(如计算pi,质数等)的任务,那么每个CPU1个线程可能是最好的。如果任务受更多 I/O 限制。就像处理来自磁盘的信息一样,那么通过每个CPU具有多个线程,您可能会获得更好的性能。在这种情况下,磁盘访问可以在 CPU 处理来自先前磁盘读取的信息时进行。

我建议您做一些测试,测试您所处的情况中的性能如何随着每个CPU内核的线程数而扩展,并据此做出决定。然后,当应用程序运行时,它可以检查并确定应生成多少线程。超线程将使操作系统和所有应用程序(包括)作为 2 个 CPU 显示单个内核,因此,如果您的应用程序可以使用超线程,您将获得好处。如果不是,那么性能将略有下降,但可能不足以在满足它方面做出额外的努力。availableProcessors()availableProcessors()


推荐