Estou executando o servidor ubuntu 16.04. Percebo que o encadeamento de hype está ativado quando uso o comando lscpu.
Eu quero desativá-lo. Eu fui a fóruns do ubuntu e aqui e aqui .
Essas são boas discussões sobre por que o hiper threading pode não ser bom. Mas não há solução definitiva sobre como desativá-lo.
Alguém pode dar as etapas para desativar o hyperthreading? Obrigado .
Respostas:
Introdução
Esta é uma pergunta interessante. Provavelmente um dos meses mais interessantes para mim pessoalmente. Como o OP, não há opção para desativar o Hyper Threading no meu BIOS antigo (inventado em 2012, atualizado em 2016 ou mais).
Erros de Hyper-Threading no Intel Skylake e Kaby Lake:
Existem inúmeros problemas com o Skylake relatados no Ask Ubuntu ao longo do ano passado e nos perguntamos como discernir quais problemas podem ter sido causados por bugs do Hyper Threading.
Esta resposta está dividida em três partes:
Exibição de CPUs quando o Hyper-Threading está ativado / desativado
Abaixo, você pode ver a utilização da CPU quando o hyperthreading está desativado e um teste de estresse da CPU é realizado. Cerca de 10 segundos depois, o mesmo script é repetido com o hyper threading ativado. Finalmente, 10 segundos depois, o script é executado com o hyperthreading desativado novamente:
A exibição é dividida em duas seções:
set-hyper-threading
com o parâmetro 0 (desativado) e depois 1 (ativado).conky
exibe a porcentagem de utilização da CPU do CPUS 1 a 8.Primeiro script executado Hyper Threading off
Na primeira vez em que o script é executado, os números de CPU 2, 4, 6 e 8 (de acordo com Conky) são congelados em 3%, 2%, 2% e 2%. Os números de CPU 1, 3, 5 e 7 aumentam para 100% enquanto o teste de estresse é executado.
A topologia da CPU é exibida com o hyperthreading desativado e apenas os quatro núcleos relatados:
Segundo script, execute o Hyper Threading em
Na segunda vez em que o script é executado, o Hyper-Threading é ativado e todos os números de CPU 1-8 aumentam para 100% enquanto o teste de estresse é executado.
A topologia da CPU é exibida com o hyperthreading ativado e apenas os quatro núcleos mais e quatro núcleos virtuais informados:
Terceiro script executado Hyper Threading off
Observe como após o término do segundo script, as CPUs 2, 4, 6 e 8 ficam ociosas a 4%, 2%, 3%, 4%. Isso é importante porque no terceiro teste, desligar o Hyper-Threading mostra as porcentagens de CPU congeladas a 4%, 2%, 3%, 4% em vez de 3%, 2%, 2% e 2% do primeiro teste.
Portanto, desativar o hyperthreading parece congelar apenas as CPUs virtuais no estado atual.
Observe também que, independentemente de você ativar ou desativar o Hyper-Threading, o script ainda exibe "Hyper Threading Supported".
Script Bash para automatizar a ativação / desativação do hyperthreading
Ao visualizar o script abaixo, lembre-se de que Conky numera as CPUs de 1 a 8, mas o Linux numera as CPUs de 0 a 7.
NOTA: O programa
stress
está embutido em todos os sistemas Debian dos quais o Ubuntu é derivado. Portanto, você não precisa baixar e instalar nenhum pacote para executar este script no Ubuntu.Se você possui uma CPU dual core, é necessário remover (ou comentar
#
) as linhas que controlam os números de CPU 5 e 7.Agradecemos à Hi-Angel pela linha bash que
grep "" /sys/devices/system/cpu/cpu*/topology/core_id
exibe a topologia da CPU.Conky falha se o Hyper Threading estiver desativado antes de iniciar
Para obter as CPUs 2, 4, 6, 8 para a menor porcentagem de utilização possível, tentei desativar o Hyper-Threading durante a inicialização. Eu usei esse script para fazer isso:
No entanto,
conky
trava com uma falha de segmentação se o hiperencadeamento estiver desativado ao iniciar. Como tal, tive que comentar as quatro@reboot
linhas do script.Código Conky para exibir a porcentagem de utilização da CPU e o fator de carga
Se você estiver interessado em configurar uma exibição semelhante no Conky, aqui está o trecho de código relevante:
NOTA: O código da Nvidia acima nunca foi testado porque ainda não tenho a GPU Nvidia funcionando no Ubuntu. Qualquer ano em breve agora :)
fonte
noht
não existe. Até aceitei a opção através de fontes linux-4.13-rc1 que ocasionalmente tenho. No entanto, eu certamente entendo o que poderia ter confundido você: o relatório de erros reclama que a opção não funciona e, em seguida, é fechadanextrelease
como se eles corrigissem algo. No entanto, se você ler os comentários, verá que o único uso denoht
é para um script artesanal que verifica a opção de linha de comando do kernel e desativa os núcleos através do/sys/
sistema de arquivos. IOWnoht
é inútil.noht
.Os kernels recentes suportam o parâmetro maxcpus kernel.
Isso permite que você defina o número de cpus com o número de núcleos físicos. Isso pode ser útil para ajudar a mitigar as ameaças causadas pelas vulnerabilidades do MDS nas CPUs Intel da família 6.
Quão:
com privilégios sudo (root), abra / etc / default / grub com seu editor de texto favorito.
Encontre a linha que começa com GRUB_CMDLINE_LINUX_DEFAULT =
e adicione maxcpus = n a qualquer parâmetro existente do kernel, como os parâmetros comuns de quiet quiet splash (onde n = o número de núcleos físicos que sua CPU possui.
Por exemplo, na minha confiável CPU Intel (R) Core (TM) i3-3220 a núcleo duplo de 3,30 GHz com hyperthreading, adicionei maxcpus = 2 para desativar o hyperthreading no momento da inicialização.
Salve o arquivo e, em seguida, emita o comando
sudo update-grub
e reinicie.Você pode confirmar o sucesso emitindo o comando
lscpu | grep "per core"
que deve fornecer uma saída como esta:Thread(s) per core: 1
Testado no kernel 4.4.0
Fontes:
https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/kernel-parameters.txt
https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/mds.html
/unix/145645/disabling-cpu-cores-on-quad-core-processor-on-linux
fonte
Você pode desativar o hyperthreading no Linux como root ou com privilégios de superusuário com:
Você pode exibir o status atual do hyperthreading com:
Este comando imprime um dos seguintes:
Como alternativa, a maioria dos firmwares do BIOS também inclui uma opção para desativar o hyperthreading. Se estiver desabilitado no BIOS, o gato acima provavelmente retornará
forceoff
.fonte
maxcpus=
parâmetro do kernel para desativar o hyperthreading. Principalmente porque não consigo encontrar nenhuma documentação oficial sobre sua interação com os núcleos de hyperthreading. É garantido que você sempre desative o hyperthreading, se você especificarmaxcpus=#real_cores
? Ou você pode acabar com metade dos núcleos reais com o HT ainda ativado em alguns sistemas? Além disso, umamaxcpus=
configuração não é portátil entre máquinas com contagens principais diferentes. Manter variações desse parâmetro para máquinas diferentes seria tedioso e propenso a erros.lscpu | grep "per core"
Você faz um ponto vaild sobre portabilidade no entanto, por outro lado definir o parâmetro do kernel uma vez não parece muito onerosas uma tarefa para mim.Aqui está um script para identificar os núcleos ht e alterná-los on-line / off-line.
@ WinEunuuchs2Unix , talvez você possa adicionar isso à sua excelente resposta.
fonte
for i in $(find /sys/devices/system/cpu/cpu[0-9]* -maxdepth 0 -type d |sort -V); do
O
maxcpus=n
parâmetro inGRUB_CMDLINE_LINUX_DEFAULT=
não funciona corretamente. Ele me deixou com 2 núcleos e 4 threads em vez de 4 núcleos e 4 threads.Eu encontrei uma solução.
Adicionar
mitigations=auto,nosmt
aoGRUB_CMDLINE_LINUX_DEFAULT=
invésTestado no Ubuntu 16.04 LTS com Linux 4.4.0.
Fonte: https://wiki.ubuntu.com/SecurityTeam/KnowledgeBase/MDS
fonte
Uma maneira um pouco mais robusta de procurar no kernel pares de hyperthread é necessária para sistemas nos quais a placa-mãe hospeda vários soquetes de CPU, porque core_id é duplicado. Aqui está minha versão em um sistema com dois chips Xeon de 8 núcleos (exemplo do Ubuntu 16.04):
Para vários propósitos, você também pode querer procurar nos arquivos
fonte
Se você leu as discussões, provavelmente sabe que geralmente não é razoável desabilitá-lo, então presumo que você o queira para fins de aprendizado.
A idéia do HT é ter vários conjuntos de registradores de CPU para cada núcleo físico (os chamados núcleos virtuais) . Não existe um núcleo virtual "melhor", eles são idênticos. Armado com esse conhecimento, você pode desativar os núcleos virtuais, exceto um para cada físico.
Primeiro, você deseja saber qual par de núcleos virtuais pertence a qual núcleo físico no
/sys/
sistema de arquivos. Você pode usar ocore_id
arquivo para isso:A partir da saída, é possível inferir que cpu0 + cpu2 estão contidos em um núcleo físico e cpu1 + cpu3 no outro. Agora eleve os privilégios e use o
echo
comando para desativar um em cada par:Observe que cpu0 não tem arquivo "online" e não pode ser desativado, então desativei cpu2.
fonte
A resposta de @ visit1985 não funcionará se o separador em thread_siblings_list não for uma vírgula (que é, por exemplo, o caso no meu sistema AMD Ryzen).
Aqui está um script para desativar o hyperthreading que funciona com qualquer separador:
E aqui está um para ativar o hyper-threading:
fonte