[TUTORIAL] Como desativar o hyper-threading

Esse tópico será um tutorial de como desativar o hyper-threading em CPU's da Intel.

O hyper-threading é uma tecnologia presente em CPU’s da Intel que permite dobrar o número de núcleos lógicos da máquina. O problema com ele? Bem, ele faz com que o desempenho piore ao invés de melhorar (raros casos), mas o principal problema com ele é a questão da segurança.
Em 2017 vimos “a loucura” que foram as falhas spectre e meltdown nos CPU’s da Intel, e o principal culpado? Isso mesmo, o hyper-threading!

Como desativar então?
Requesitos mínimos: usar grub e um kernel acima da versão 4.

1º forma: Desativar pela BIOS.

Problema? Nem todas as BIOS dão a opção para desativar o HT.

2º forma: Desativar pelo kernel Linux.

Passo 1: Abra o terminal.
Passo 2: Entre como super-usuário (root)
Passo 3: Digite: nano /etc/default/grub (você pode substituir o nano com o editor de texto de sua preferência).
Passo 4: Vá até a linha GRUB_CMDLINE_LINUX="" e escreva nosmt=force entre as aspas ("").
Passo 5: Salve e saia (no nano é control+x --> y --> enter)
Passo 6: Faça o update do GRUB (no Debian é update-grub)
Passo 7: Reinicie e seja feliz.

Considerações finais:
CPU’s testados: Intel Core I5 7200u (Acer Aspire 5) e Intel Core I3 4005u (Dell Inspiron).
Distros testadas: Devuan ASCII e Beowulf.
Isso afeta o desempenho? SIM.

Qualquer dúvida é só comentar.

4 Curtidas

Estou imaginando agora um Linux com a filosofia do OpenBSD vindo com isso por padrão.

1 Curtida

As falhas são preocupantes, mas a chance de ter algum problema por conta delas, ainda mais no GNU/Linux e com o kernel atualizado, é mínima. Não vale a perda de desempenho, que pode ser colossal para diversos processadores (como esses ULVs de notebook que são apenas dual core) em quase qualquer cenário de maior exigência.

Resolvi testar pra ver se havia diferença perceptível:

Hyperthreading desativado:

rod@gentooe6410 ~ $ systemd-analyze
Startup finished in 3.081s (kernel) + 5.723s (initrd) + 13.099s (userspace) = 21.905s
graphical.target reached after 13.081s in userspace

Tempo para carregar o Plasma: 16 segundos (cronometro)

HyperThreading ativado:

rod@gentooe6410 ~ $ systemd-analyze
Startup finished in 3.116s (kernel) + 6.054s (initrd) + 15.000s (userspace) = 24.172s
graphical.target reached after 14.984s in userspace

Tempo para carregar o Plasma: 24 segundos (cronometro)

Conclusão

Eu achei que a diferença fosse pequena, imperceptível em um teste simples com o cronometro. Mas é achei o resultado impressionante! Acho que cada computador deve se comportar diferente, possivelmente uma menor paralelização ajudou o bcache e o hdd a funcionarem mais rapidamente. Eu desativei na BIOS o hyperthreading e é interessante que tem uma descrição lá: “This field specifies whether or not the CPU will run with the processor Hyperthreading© enabled. The performance of some applications may improve with Hyperthreading© disabled” Ou seja, o próprio fabricante já dava uma dica que o dual core poderia ser mais rápido que o falso quad-core…

1 Curtida

Usando nosmt=force

rod@gentooe6410 ~ $ systemd-analyze
Startup finished in 3.168s (kernel) + 6.041s (initrd) + 14.383s (userspace) = 23.593s
graphical.target reached after 14.361s in userspace

Tempo para carregar o Plasma: 17 segundos (cronometro)

Ou seja, ficou intermediário. O carregamento do kernel e initrd ficaram igual ao hyperthreading ativado (esperado pois está descompactando os conteúdos com os 4 threads) mas depois que carrega o kernel melhor pro userspace e fica bom no carregamento da interface.

1 Curtida

Mas infelizmente é um balanço… Desativando o hyperthreading o sistema ficou menos fluido e tive travamentos bem pronunciados durante videos em 60 fps… Também testei desativado com um kernel realtime, e ficou bem melhor com relação a fluidez, mas mesmo assim menos fluido do que um kernel desktop com smt ativado.

Acho que se eu tivesse preocupado com relação à segurança, usaria o smt desativado com kernel real time. Mas como é um computador de uso recreativo vou deixar ativado.

O que seria esse kernel real time?

É o kernel compilado com preempção, ou seja, altamente disposto a mudar de atividade. O contrário é o modelo “server” que prefere atividade ser executada até o fim para iniciar outra. O modelo “desktop” é um meio termo.

Geralmente as distribuições tem opção de kernel compilado com preempção e chamam de RT ou realtime, pois é bastante positivo em atividades de baixa latência como edição de áudio e vídeo. Também o kernel padrão do ubuntu studio, distribuição voltada para esse público multimidia. No debian vc instala pelo pacote linux-image-rt

1 Curtida

Planet CCRMA(karma) fornece kernel-rt e softwares de audio para fedora/centos, só para deixar registrado.

Quanto a questão do smt, na minha máquina em benchmarks com o Geekbench sem smt o desempenho caiu pela metade, não tenho mais os links infelizmente.

Dependendo da sua aplicação, ela pode ficar mais rápida desativando HT (monotasking).
Mas depende, pode compensar em alguns casos específicos e talz, tem que testar e ver se precisa.

Concordo que para quem quer proteção ao máximo, tipo servidor, o HT deveria ser desabilitado mesmo.

Aí você escolhe: segurança ou velocidade.

Eu tenho umas funções para desabilitar. Os comandos de ativar/desativar devem ser executados como raiz e talvez tenha problemas em executá-los dentro de uma sessão do TMUX (depende da config do seu TMUX):

#cpu stats
model()
{
	cat /proc/cpuinfo
}
cores()
{
	grep -H . /sys/devices/system/cpu/cpu*/topology/thread_siblings_list
}

#check if intel hyperthread is enabled
#prints 'ht' if enabled
ht()
{
	grep -o ht /proc/cpuinfo | uniq
}

#disable one of each sibling ht
dht()
{
	local i
	for i in 2 3
	do
		echo "Disabling logical HT core $i"
		echo 0 > /sys/devices/system/cpu/cpu${i}/online
	done
}

#enable hyperthreading
eht()
{
	local i
	for i in 2 3
	do
		echo "Enabling logical HT core $i"
		echo 1 > /sys/devices/system/cpu/cpu${i}/online;
	done
}
1 Curtida

Em softwares como jogos antigos, que dependem quase que exclusivamente do desempenho single ou dual core, o HT (ou SMT) pode realmente até atrapalhar em alguns casos. Pelo que sei, em programas mal otimizados, a divisão de tarefas entre os núcleos pode ser mal feita e atividades podem ser direcionadas às threads extras enquanto os núcleos físicos ficam ociosos.

Bloco de Citação
When SMT is activated, 4 processors are available. The 2 physical processors are the CPU 0, 1 and the two logical processors are CPU 2, 3. If an application which for example manages 2 threads shares them wrongly, on say CPU 0 and 3, performance will drop because only 1 of the 2 physical cores are used. As a result, when software shows a drop in performance, there are two possible solutions: disactivate SMT completely, or manually set up the affinity of the software in the task manager.

Contudo, ao usar mais de um programa aberto ao mesmo tempo ou realizar qualquer atividade um pouco mais pesada, facilmente se usa mais que isso. Para quem só vai navegar na Internet, editar documentos e fazer coisas do tipo, pode nem fazer diferença. Mas para qualquer tarefa um pouquinho mais exigente, desativar esse recurso é abrir mão de muito desempenho e, possivelmente, conviver com travamentos. Por sinal, até algum tempo atrás (gerações anteriores), esse recurso era justamente a principal diferença e praticamente a única justificativa para comprar um Core i7 no lugar de um Core i5, por exemplo.

2 Curtidas

Eu não faço coisas muito pesadas (máximo edição de vídeo não-profissional) e deixo o smt desativado…
(meu i5 virou um pentium dual-core)

1 Curtida

Na minha BIOS tem a opçãp de nucléos, eu tenho opções como:
usar 1 , 2 ou todos os nucléos que no meu caso são 4 , esse tutorial se refere a esse meu caso ???
ela tem a Tecnologia Hyper-Threading Intel® oferece dois segmentos de processamento por núcleo físico,
ai tem a opção de 1 , 2 ou all , no meu caso eu deixo ativo apenas 2 né isso ???