在Java中启用Intel超线程

7

我有一个多线程程序正在四核英特尔i7上运行。当我执行Runtime.getRuntime.availableProcessors()时,我得到了8,而且我知道这个CPU支持超线程。

然而,当我创建线程时,我的CPU利用率在4个线程上达到100%(即非零),这意味着有4个线程是未使用的。是否有办法在Java中启用超线程?


2
HT是处理器的特性,操作系统会使用它。Java无法影响它。如果您想要使用所有8个处理器,则您的代码应该通过创建8个线程等方式来使用它们。 - Sergey Litvinov
1
超线程由Java启用,因为它使用本机线程,因此这是一个操作系统/ CPU配置。但是,超线程不会给您额外的核心,它允许四个CPU的时间共享。如果您已经使用四个线程占用了四个CPU,则无论超线程打开还是关闭都是可能的。 - Chris K
这是操作系统和/或机器的工作。如果它们没有启用它,Java 将不会提供任何能力。(如果它们启用了,Java 应该自动利用它。) - cHao
这个链接 https://dev59.com/hmgt5IYBdhLWcg3w5har 可能会有所帮助。 - Doon
1
如果你的 CPU 利用率达到了 100%,那么很可能是代码出了问题。 - T McKeown
1
谢谢大家提供的所有出色答案。 - Ryan Dougherty
2个回答

8
超线程是通过所有现代JVM使用本机线程实现的,因此这是一个操作系统/CPU配置设置。
然而,超线程并不能给你额外的核心,它允许对四个CPU进行细粒度的时间共享。也就是说,当一个线程被阻塞时,比如等待将某个内存页流入缓存,那么另一个线程就可以进来利用CPU的部分。由于更复杂的调度需求,它会使CPU核心的大小增加约10%,并不适用于所有应用程序。
如果您已经用四个线程占满了四个CPU,那么无论超线程是否打开,都是可能的。这意味着这些线程正在高速运行,几乎没有阻塞。
Java报告8个核心CPU的原因是因为操作系统告诉Java CPU有8个核心。操作系统认为这样做是因为操作系统被告知要像8个核心CPU一样调度线程,这使得在操作系统中添加对超线程的支持变得更加简单。操作系统继续像以前一样管理线程,对超线程的内部工作几乎一无所知,并让CPU在可用的部分上管理汇编的低级调度。

这里可以阅读更加详细的讨论和基准测试(点击此处)


2
我们对自己开发的Java应用程序进行了广泛的性能分析。我惊讶地发现,在许多启用“实时”(高吞吐量)和线程敏感的JVM中,如果禁用超线程,我们可以获得更好的性能。我怀疑这是因为Java被告知有可用的线程,但最终由于操作无法像超线程营销部门所希望的那样流水线化而被延迟。总之,如果您正在进行高吞吐量应用程序的开发,您可以尝试测试超线程是否真正有益。 - pozcircuitboy

3
请使用以下命令。
$ lscpu

该输出可用于确定实际核心数以及是否启用了超线程。

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                32
On-line CPU(s) list:   0-31
Thread(s) per core:    2
Core(s) per socket:    8
Socket(s):             2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 45
Stepping:              7
CPU MHz:               2399.995
BogoMIPS:              4799.35
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              20480K
NUMA node0 CPU(s):     0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30
NUMA node1 CPU(s):     1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31

实际可达到的并行性将是(插槽数)X(每个插槽的内核数)X(每个内核的线程数)。要确定您的处理器是否支持超线程,您可以使用每个内核的线程参数。


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