Habilite Intel Hyperthreading em Java
-
21-12-2019 - |
Pergunta
Eu tenho um programa multithread em execução em um Intel i7 quad-core.Quando eu executo Runtime.getRuntime.availableProcessors()
, recebo 8 e sei que o hyperthreading está disponível nesta CPU.
No entanto, quando crio threads, meus níveis de CPU estão em 100% (ou seja,diferente de zero) para 4 threads, o que significa que 4 threads não são utilizados.Existe alguma maneira de habilitar o hyperthreading em Java?
Solução
O hyperthreading é habilitado pelo fato de que todas as JVMs modernas usam threads nativos, portanto, esta é uma configuração de sistema operacional/CPU.
No entanto, o Hyperthreading não oferece núcleos extras, ele permite o compartilhamento de tempo refinado dos quatro CPUs que você possui.Ou seja, enquanto um thread está paralisado, digamos, aguardando que uma página de memória seja transportada para o cache, outro thread pode entrar e fazer uso de partes da CPU.Ele adiciona cerca de 10% a mais ao tamanho de um núcleo de CPU devido a requisitos de agendamento mais complexos e não beneficia todos os aplicativos.
Se você atingiu o máximo de quatro CPUs com quatro threads, isso é possível com o hyperthreading ativado ou desativado.Significa apenas que esses threads estão funcionando bem, sem bloquear muito.
A razão pela qual Java relata uma CPU de 8 núcleos, em vez de 4, é porque o sistema operacional informa ao Java que a CPU possui 8 núcleos.O sistema operacional acredita que, como foi instruído a agendar threads como se fosse uma CPU de 8 núcleos, isso tornou a adição de suporte de hyperthreading aos sistemas operacionais muito mais simples.O sistema operacional continua gerenciando threads como antes, alheio a grande parte do funcionamento interno do hyperthreading e permite que a CPU gerencie o agendamento de baixo nível da montagem conforme e quando partes da CPU ficam disponíveis.
Uma discussão mais detalhada, com benchmarks, pode ser lida aqui
Outras dicas
Use o seguinte comando
$ lscpu
A saída pode ser usada para determinar o número real de núcleos e se o hyperthreading está habilitado ou não.
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
O paralelismo real que pode ser alcançado será (No.de soquetes) X (núcleos por soquete) X (threads por núcleo).Para determinar se o seu processador é hiperthread ou não, você pode usar o parâmetro Threads por núcleo.