每个处理器的线程数

时间:2008-10-18 16:35:18

标签: java concurrency

在Java中,是否有一种编程方式可以找出CPU支持多少并发线程?

更新

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

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

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

7 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分:19)

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

最佳数量取决于任务。如果这是一项需要大量CPU资源且不需要任何I / O(如计算pi,素数等)的任务,那么每个CPU的1个线程可能是最好的。如果任务更多I / O绑定。比如从磁盘处理信息,那么每个CPU有多个线程可能会获得更好的性能。在这种情况下,磁盘访问可以在CPU处理来自先前磁盘读取的信息时进行。

我建议你做一些测试,了解你的情况下的性能如何与每个CPU核心的线程数一起扩展,并根据它来决定。然后,当您的应用程序运行时,它可以检查availableProcessors()并确定它应该生成多少个线程。 超线程将使单核看起来像操作系统和所有应用程序,包括availableProcessors(),作为2个CPU,因此如果您的应用程序可以使用超线程,您将获得好处。如果没有,那么性能会受到轻微影响,但可能还不足以为此付出额外的努力。

答案 2 :(得分:4)

没有标准的方法来获取Java中每个CPU核心支持的线程数。最好的办法是获得一个Java CPUID实用程序,它为您提供处理器信息,然后将其与您必须生成的表进行匹配,从而为您提供处理器管理的每个核心的线程,而无需“真正的”上下文切换。 / p>

- 亚当

答案 3 :(得分:1)

CPU通常不会对线程数量造成限制,我认为Java本身对其产生的本机(内核)线程数量没有限制。

Runtime类中有一个方法availableProcessors()。这就是你要找的东西吗?

答案 4 :(得分:1)

基础: 加载到内存中的应用程序是进程。一个进程至少有1个线程。如果需要,您可以在进程中创建任意数量的线程(理论上)。因此线程数取决于您和您使用的算法。

如果使用线程池,则表示线程池管理线程数,因为创建线程会消耗资源。线程池回收线程。这意味着许多逻辑线程可以一个接一个地在一个物理线程内运行。

您不必考虑线程数,它由线程池算法管理。线程池为服务器和桌面计算机(操作系统)选择不同的算法。

<强> EDIT1: 如果您认为线程池不使用您拥有的资源,则可以使用显式线程。在这种情况下,您可以明确地管理线程数。

答案 5 :(得分:1)

每个处理器或处理器核心一次只能做一件事。对于超线程,事情会有所不同,但大多数情况仍然如此,这就是为什么我的HT机器在工作时几乎从不超过50%,即使它在100%时,它也不是一次处理两倍。

您可能只需要对计划部署的常见体系结构进行一些测试,以确定要在每个CPU上运行多少个线程。如果您正在等待大量I / O,那么仅使用1个线程可能会太慢。运行大量线程会降低速度,因为处理器必须更频繁地切换线程,这可能会非常昂贵。我不确定是否有任何硬编码限制你可以运行多少线程,但我保证你的应用程序可能会在你达到任何硬​​限制之前从过多的线程切换中爬行。最后,您应该将其作为配置文件中的一个选项,以便您可以轻松地将应用程序调整到您正在运行它的任何处理器上。

答案 6 :(得分:0)

这是VM的功能,而不是CPU的功能。它与每个线程消耗的堆量有关。当堆上的空间不足时,就完成了。与其他海报一样,如果由于线程数而超出堆空间,我怀疑您的应用在此之前变得无法使用。

请参阅此discussion