introduzione
Questa è una domanda interessante Probabilmente uno dei più interessanti da mesi per me personalmente. Come l'OP non esiste alcuna opzione per disabilitare Hyper Threading nel mio vecchio BIOS (inventato nel 2012, aggiornato nel 2016 o giù di lì).
Bug Hyper-Threading in Intel Skylake e Kaby Lake:
Chiunque utilizzi processori Intel Skylake o Kaby Lake deve leggere le segnalazioni di bug relative a Hyper Threading emerse un paio di mesi fa. Questa storia del Registro del Regno Unito spiega come gli sviluppatori Debian hanno notato come Hyper Threading può arrestare e danneggiare la macchina.
Ci sono numerosi problemi con Skylake riportati in Ask Ubuntu nell'ultimo anno e ci si chiede come discernere quali problemi potrebbero essere stati causati dai bug di Hyper Threading.
Questa risposta è divisa in tre parti:
- Visualizzazione delle CPU quando Hyper-Threading è disattivato / attivato
- Script di Bash per automatizzare l'attivazione / disattivazione dell'hyper-threading
- Conky si blocca se Hyper Threading è disattivato prima che inizi
Visualizzazione delle CPU quando Hyper-Threading è disattivato / attivato
Di seguito è possibile visualizzare l'utilizzo della CPU quando l'hyper-threading è disattivato e viene eseguito uno stress test della CPU. Circa 10 secondi dopo lo stesso script viene ripetuto con l'hyper threading attivato. Finalmente 10 secondi dopo che lo script viene eseguito con l'hyper-threading disattivato di nuovo:
Il display è diviso in due sezioni:
- Sulla metà sinistra della finestra del terminale invoca lo script
set-hyper-threading
con il parametro 0 (off) e quindi 1 (on).
- Nella metà destra
conky
viene visualizzato l'utilizzo percentuale CPU di CPUS da 1 a 8.
Il primo script esegue Hyper Threading
La prima volta che viene eseguito lo script, i numeri CPU 2, 4, 6 e 8 (secondo Conky) vengono congelati al 3%, 2%, 2% e 2%. I numeri CPU 1, 3, 5 e 7 aumentano al 100% mentre viene eseguito lo stress test.
La topologia della CPU viene visualizzata con l'hyper-threading disattivato e vengono riportati solo i quattro core:
/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
Il secondo script esegue Hyper Threading
La seconda volta che viene eseguito lo script Hyper-Threading viene attivato e tutti i numeri di CPU 1-8 aumentano al 100% mentre viene eseguito lo stress test.
La topologia della CPU viene visualizzata con l'hyper-threading attivato e vengono riportati solo i quattro core plus e quattro core virtuali:
/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
Il terzo script esegue Hyper Threading
Nota come dopo la fine del secondo script le CPU 2, 4, 6 e 8 sono inattive al 4%, 2%, 3%, 4%. Ciò è importante perché nel terzo test la disattivazione di Hyper-Threading mostra le percentuali di CPU bloccate al 4%, 2%, 3%, 4% anziché 3%, 2%, 2% e 2% dal primo test.
Pertanto, disattivare l'hyper-threading sembra bloccare le CPU virtuali allo stato corrente.
Nota anche se si attiva o disattiva Hyper-Threading lo script visualizza ancora "Hyper-Threading supportato".
Script di Bash per automatizzare l'attivazione / disattivazione dell'hyper-threading
Quando si visualizza lo script seguente, tenere presente che Conky numera le CPU da 1 a 8 ma Linux numera le CPU da 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: il programma stress
è integrato in tutti i sistemi Debian di cui Ubuntu è un derivato. Pertanto non è necessario scaricare e installare alcun pacchetto per eseguire questo script in Ubuntu.
Se hai una CPU dual core devi rimuovere (o commentare con #
) le linee che controllano i numeri CPU 5 e 7.
Ringraziamo Hi-Angel per la riga bash che grep "" /sys/devices/system/cpu/cpu*/topology/core_id
mostra la topologia della CPU.
Conky si blocca se Hyper Threading è disattivato prima che inizi
Per ottenere CPU dal 2, 4, 6, 8 all'utilizzo percentuale più basso possibile, ho provato a disattivare Hyper-Threading durante l'avvio. Ho usato questo script per farlo:
# 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
Tuttavia si conky
arresta in modo anomalo con un errore di segmentazione se l'hyper-threading è disattivato all'avvio. Come tale ho dovuto commentare le quattro @reboot
righe della sceneggiatura.
Codice Conky per visualizzare l'utilizzo percentuale CPU e il fattore di carico
Se sei interessato a configurare un display simile in Conky, ecco lo snippet di codice pertinente:
${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: il codice Nvidia sopra non è mai stato testato perché la GPU Nvidia non funziona ancora con Ubuntu. Ogni anno presto ora :)