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:
Qualquer pessoa que utilize os processadores Intel Skylake ou Kaby Lake deve ler os relatórios de bugs sobre o Hyper Threading que surgiram alguns meses atrás. Esta história do UK Register mostra como os Desenvolvedores Debian descobriram como o Hyper Threading pode travar e corromper a máquina.
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
- Script Bash para automatizar a ativação / desativação do hyperthreading
- Conky falha se o Hyper Threading estiver desativado antes de iniciar
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:
- Na metade esquerda, a janela do terminal chamando o script
set-hyper-threading
com o parâmetro 0 (desativado) e depois 1 (ativado).
- Na metade direita,
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:
/sys/devices/system/cpu/cpu0/topology/core_id:0
/sys/devices/system/cpu/cpu2/topology/core_id:1
/sys/devices/system/cpu/cpu4/topology/core_id:2
/sys/devices/system/cpu/cpu6/topology/core_id:3
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:
/sys/devices/system/cpu/cpu0/topology/core_id:0
/sys/devices/system/cpu/cpu1/topology/core_id:0
/sys/devices/system/cpu/cpu2/topology/core_id:1
/sys/devices/system/cpu/cpu3/topology/core_id:1
/sys/devices/system/cpu/cpu4/topology/core_id:2
/sys/devices/system/cpu/cpu5/topology/core_id:2
/sys/devices/system/cpu/cpu6/topology/core_id:3
/sys/devices/system/cpu/cpu7/topology/core_id:3
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.
#!/bin/bash
# NAME: set-hyper-threading
# PATH: /usr/local/bin
# DESC: Turn Hyper threading off or on.
# DATE: Aug. 5, 2017.
# NOTE: Written Part of testing for Ubuntu answer:
# /ubuntu/942728/disable-hyper-threading-in-ubuntu/942843#942843
# PARM: 1="0" turn off hyper threading, "1" turn it on.
if [[ $# -ne 1 ]]; then
echo 'One argument required. 0 to turn off hyper-threading or'
echo '1 to turn hyper-threading back on'
exit 1
fi
echo $1 > /sys/devices/system/cpu/cpu1/online
echo $1 > /sys/devices/system/cpu/cpu3/online
echo $1 > /sys/devices/system/cpu/cpu5/online
echo $1 > /sys/devices/system/cpu/cpu7/online
grep "" /sys/devices/system/cpu/cpu*/topology/core_id
grep -q '^flags.*[[:space:]]ht[[:space:]]' /proc/cpuinfo && \
echo "Hyper-threading is supported"
grep -E 'model|stepping' /proc/cpuinfo | sort -u
stress --cpu 8 --io 1 --vm 1 --vm-bytes 128M --timeout 10s
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:
# NAME: /etc/cron.d/turn-off-hyper-threading
# DATE: Auguust 5, 1017
# DESC: This turns off CPU 1, 3, 5 & 7
# NOTE: Part of testing for Ubuntu answer:
# /ubuntu/942728/disable-hyper-threading-in-ubuntu/942843#942843
# BUGS: Conky crashes with Segmentation Fault when CPU 2,4,6 & 8 (as conky calls them)
# are off-line.
#
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#
# @reboot root echo 0 > /sys/devices/system/cpu/cpu1/online
# @reboot root echo 0 > /sys/devices/system/cpu/cpu3/online
# @reboot root echo 0 > /sys/devices/system/cpu/cpu5/online
# @reboot root echo 0 > /sys/devices/system/cpu/cpu7/online
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:
${color orange}${voffset 2}${hr 1}
${color2}${voffset 5}Intel® i-7 3630QM 3.4 GHz: ${color1}@ ${color green}${freq} MHz
${color}${goto 13}CPU 1 ${goto 81}${color green}${cpu cpu1}% ${goto 131}${color3}${cpubar cpu1 18}
${color}${goto 13}CPU 2 ${goto 81}${color green}${cpu cpu2}% ${goto 131}${color3}${cpubar cpu2 18}
${color}${goto 13}CPU 3 ${goto 81}${color green}${cpu cpu3}% ${goto 131}${color3}${cpubar cpu3 18}
${color}${goto 13}CPU 4 ${goto 81}${color green}${cpu cpu4}% ${goto 131}${color3}${cpubar cpu4 18}
${color}${goto 13}CPU 5 ${goto 81}${color green}${cpu cpu5}% ${goto 131}${color3}${cpubar cpu5 18}
${color}${goto 13}CPU 6 ${goto 81}${color green}${cpu cpu6}% ${goto 131}${color3}${cpubar cpu6 18}
${color}${goto 13}CPU 7 ${goto 81}${color green}${cpu cpu7}% ${goto 131}${color3}${cpubar cpu7 18}
${color}${goto 13}CPU 8 ${goto 81}${color green}${cpu cpu8}% ${goto 131}${color3}${cpubar cpu8 18}
${color1}All CPU ${color green}${cpu}% ${goto 131}${color1}Temp: ${color green}${hwmon 2 temp 1}°C ${goto 250}${color1}Up: ${color green}$uptime
${color green}$running_processes ${color1}running of ${color green}$processes ${color1}loaded processes.
Load Avg. 1-5-15 minutes: ${alignr}${color green}${execpi .001 (awk '{printf "%s/", $1}' /proc/loadavg; grep -c processor /proc/cpuinfo;) | bc -l | cut -c1-4} ${execpi .001 (awk '{printf "%s/", $2}' /proc/loadavg; grep -c processor /proc/cpuinfo;) | bc -l | cut -c1-4} ${execpi .001 (awk '{printf "%s/", $3}' /proc/loadavg; grep -c processor /proc/cpuinfo;) | bc -l | cut -c1-4}
${color1}NVIDIA ${color}-GPU ${color green}${nvidia gpufreq} Mhz ${color}-Memory ${color green}${nvidia memfreq} Mhz
${color1}GT650M ${color}-Temp ${color green}${nvidia temp}°C ${color}-Threshold ${color green}${nvidia threshold}°C
${color orange}${voffset 2}${hr 1}
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 :)