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.
nano /etc/rc.local
# place this near the end before the "exit 0"
for CPU in /sys/devices/system/cpu/cpu[0-9]*; do
CPUID=$(basename $CPU)
echo "CPU: $CPUID";
if test -e $CPU/online; then
echo "1" > $CPU/online;
fi;
COREID="$(cat $CPU/topology/core_id)";
eval "COREENABLE=\"\${core${COREID}enable}\"";
if ${COREENABLE:-true}; then
echo "${CPU} core=${CORE} -> enable"
eval "core${COREID}enable='false'";
else
echo "$CPU core=${CORE} -> disable";
echo "0" > "$CPU/online";
fi;
done;
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.
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.