Eu tenho um sistema executando um aplicativo de negociação financeira em uma instalação remota. Não tenho acesso à OIT / DRAC, mas preciso desativar o hyperthreading. O sistema executa CPUs hexagonais Intel Westmere 3.33GHz X5680. Posso reiniciar, mas quero garantir que o sistema não ative o hyperthreading devido a problemas de desempenho. Existe uma maneira limpa de fazer isso no Linux?
Edit: A noht
diretiva adicionada à linha de comando de inicialização do kernel não funcionou. O mesmo para RHEL.
Consulte: https://bugzilla.redhat.com/show_bug.cgi?id=440321#c9
fonte
sysbench --num-threads=1 --test=cpu run
com diferentes num-threads e o HT ativado e desativado diz que desabilitar o HT diminui o desempenho quando há muitos threads, e mesmo se houver apenas um thread, não há benefício em desativar o HT. Então, sugiro deixar como está: é ótimo.echo 1
vez deecho 0
ativá-los novamente.Um script para desativar o hyperthreading na inicialização da máquina ...
Para desativar o hyperthreading, incluo um script na máquina /etc/rc.local. Não é exatamente limpo, mas é fácil de instalar, independente da arquitetura da CPU e deve funcionar em qualquer distribuição Linux moderna.
Como isso funciona?
As informações e os controles do kernel do Linux podem ser acessados como arquivos no diretório / sys nas modernas distribuições linux. Por exemplo:
/ sys / devices / system / cpu / cpu3 contém as informações e controles do kernel da CPU lógica 3.
cat / sys / devices / system / cpu / cpu3 / topology / core_id mostrará o número principal a que esta cpu lógica pertence.
eco "0"> / sys / devices / system / cpu / cpu3 / online permite desativar a cpu lógica 3.
Por que isso funciona?
Não sei exatamente o porquê ... mas o sistema se torna mais responsivo com o hyperthreading desativado (no meu notebook i5 e nos enormes servidores Xeon com mais de 60 núcleos). Eu acho que isso tem a ver com caches por CPU, alocação de memória por CPU, alocação de agendador de CPU e iterações complexas de prioridades de processo. Eu acho que os benefícios do hyperthreading são superados pela complexidade de criar agendadores de CPU que sabem usá-lo.
Para mim, o problema com o hyperthreading é: se eu iniciar tantos threads intensivos em CPU quanto núcleos lógicos, terei alternâncias de contexto rápidas para as tarefas intensivas em CPU, mas caras para as tarefas em segundo plano, pois o hyperthreading totalmente consumido pelo tarefas intensivas da CPU. Por outro lado, se eu iniciar tantos threads com muita CPU quanto núcleos físicos, não terei alternâncias de contexto para essas tarefas e alternâncias rápidas de contexto para as tarefas em segundo plano. Parece bom, mas as tarefas em segundo plano encontrarão processadores lógicos gratuitos e serão executadas quase imediatamente. É como se tivessem desempenho em tempo real (agradável -20).
No primeiro cenário, o hyperthreading é útil, as tarefas em segundo plano usarão alternâncias caras de contexto, porque eu estimei o hyperthreading com o processamento normal. O segundo é inaceitável, porque até 50% do meu poder da CPU é priorizado nas tarefas em segundo plano.
As tarefas "intensivas em CPU" que estou falando são servidores de autorização e mineração de dados de inteligência artificial (meu trabalho). Renderização do Blender em computadores e clusters baratos (para esboçar minha futura casa).
Além disso, isso é adivinhação.
Tenho a impressão de que é melhor, mas talvez não.
fonte
Para kernels realmente antigos (Linux 2.6.9 ou mais), anexe o parâmetro noht ao kernel na inicialização.
Esta opção de linha de comando do kernel foi removida desde pelo menos o Linux 2.6.18 .
Em http://www.faqs.org/docs/Linux-HOWTO/BootPrompt-HOWTO.html :
Se você estiver usando o lilo, edite o arquivo /etc/lilo.conf (e execute o lilo depois) ou se estiver usando o grub, edite o seu /boot/grub/menu.lst.
fonte
noht
entrada na linha de comando do grub kernel. O sistema não honrou onoht
comando. O mesmo para RHEL. Veja: bugzilla.redhat.com/show_bug.cgi?id=440321#c9noht
opção do kernel foi removida. Isso é lamentável, porque o Linux permite uma solução alternativa para algumas erratas do Haswell perf-counter (BJ122, BV98, HSD29) somente se o HT estiver ativado , e isso acontece antes que o initramfs seja carregado.Você pode usar o "thread_siblings_list" para cada núcleo para desativar o segundo núcleo no par HT.
O pipeline de comando a seguir é hacky, não otimizado e é feito dessa maneira, para facilitar a compreensão.
portanto, pegue todas as listas de irmãos de threads, extraia a segunda CPU para cada par, obtenha uma lista exclusiva e desative-as.
Isso faz sentido?
se eu fizer "cat / proc / cpuinfo" depois de executar o procedimento acima, o número de núcleos será reduzido pela metade.
fonte
echo 0 > /sys/devices/system/cpu/cpu$X/online
torna - seecho 0 | sudo tee /sys/devices/system/cpu/cpu$X/online
Os kernels mais recentes fornecem um controle SMT (multithreading simultâneo).
Você pode verificar o estado do SMT com;
Mude o estado com
As opções são;
Nós testamos isso com o Linux Kernel 4.4.0
fonte
A resposta de Lukas é boa, mas não funciona realmente para desativar o HT, porque o ID principal não pode servir para a identificação de irmãos HT. Este script funciona:
fonte
Eu tive que esperar até poder entrar na OIT / Drac. Os parâmetros de inicialização do kernel não funcionam nas distribuições atuais do Linux.
fonte
No pacote libsmbios-bin (Debian, Ubuntu, etc), você tem os binários isCmosTokenActive e activeCmosToken. Juntamente com a lista de tokens , você pode tentar algo como isto:
Em seguida, ative o token CPU_Hyperthreading_Disable:
Verificar:
Agora, a grande questão é se você simplesmente precisa de uma reinicialização para que isso entre em vigor ou se é necessário um ciclo de energia completo. Experimente e veja como vai!
fonte
Com base nas informações fornecidas por Paul M aqui, eu as "script" desta maneira:
Claro que não está desativando o hyper-threading no mesmo sentido que mexer com o BIOS faria , basicamente, apenas diz ao agendador de tarefas do kernel para não usar alguns núcleos, porque sabemos que eles são falsos.
O software que assumiu com base no estado
/proc
ou/sys
subsistema anterior ainda pode estar executando abaixo do ideal ou até falhar devido a essa alteração no tempo de execução, portanto, sua reinicialização pode ser necessária. Por exemplo, notei queirqbalance
estava propenso a falhar nessas circunstâncias.fonte
Desativar HT:
Ativar HT:
Nota: Isso realmente não desabilita o HyperThreading, mas desativa os núcleos "falsos", obtendo quase o mesmo resultado.
fonte
tee
, mas isso ainda deixa de fornecer uma resposta real à pergunta. Esses comandos se aplicam apenas a configurações específicas de hardware e podem ter efeitos indesejados em outras configurações de hardware. E uma explicação do que esses comandos fazem é completamente ausente.Tópico antigo, mas tinha motivos para tentar este experimento. Primeiro, não tenho certeza de que desabilitar as CPUs (um pouco falsas) em tempo de execução é realmente equivalente à desabilitação do Hyperthreading na inicialização. Dito isso, vi um pequeno aumento de desempenho em nosso aplicativo. (Mas não o suficiente para manter.)
Utilizou o valor thread_siblings (comum a CPUs com hyperthread) como uma chave para ativar / desativar:
Tente o comando sem o sudo sh final para verificar se está correto.
fonte