Introducción
Esta es una pregunta interesante. Probablemente uno de los más interesantes en meses para mí personalmente. Al igual que el OP, no hay opción para deshabilitar Hyper Threading en mi BIOS anterior (inventado en 2012, actualizado en 2016 más o menos).
Errores de Hyper-Threading en Intel Skylake y Kaby Lake:
Cualquiera que use los procesadores Intel Skylake o Kaby Lake debe leer los informes de errores sobre Hyper Threading que aparecieron hace un par de meses. Esta historia de UK Register explica cómo los desarrolladores de Debian detectaron cómo Hyper Threading puede bloquear y dañar la máquina.
Hay numerosos problemas con Skylake reportados en Ask Ubuntu durante el último año y uno se pregunta cómo discernir qué problemas pueden haber sido causados por los errores de Hyper Threading.
Esta respuesta se divide en tres partes:
- Visualización de CPU cuando Hyper-Threading está apagado / encendido
- Bash script para automatizar el encendido / apagado de hyper-threading
- Conky se bloquea si Hyper Threading está apagado antes de comenzar
Visualización de CPU cuando Hyper-Threading está apagado / encendido
A continuación, puede ver la utilización de la CPU cuando el subproceso múltiple está desactivado y se realiza una prueba de esfuerzo de la CPU. Aproximadamente 10 segundos después, se repite el mismo script con Hyper Threading activado. Finalmente, 10 segundos después de eso, el script se ejecuta con Hyper-Threading desactivado nuevamente:
La pantalla se divide en dos secciones:
- En la mitad izquierda de la ventana de terminal invocando el script
set-hyper-threading
con el parámetro 0 (apagado) y luego 1 (encendido).
- En la mitad derecha, se
conky
muestra el porcentaje de utilización de CPU de CPUS 1 a 8.
El primer script ejecuta Hyper Threading
La primera vez que se ejecuta el script Los números de CPU 2, 4, 6 y 8 (según Conky) se congelan al 3%, 2%, 2% y 2%. Los números 1, 3, 5 y 7 de la CPU aumentan al 100% mientras se ejecuta la prueba de esfuerzo.
La topología de la CPU se muestra con Hyper-Threading desactivado y solo los cuatro núcleos informan:
/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
El segundo script ejecuta Hyper Threading en
La segunda vez que se ejecuta el script, Hyper-Threading se activa y todos los números de CPU 1-8 aumentan al 100% mientras se ejecuta la prueba de esfuerzo.
La topología de la CPU se muestra con Hyper-Threading activado y solo se informan los cuatro núcleos plus y los cuatro núcleos virtuales:
/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
El tercer script ejecuta Hyper Threading
Observe cómo después de que finaliza el segundo script, las CPU 2, 4, 6 y 8 están inactivas al 4%, 2%, 3%, 4%. Esto es importante porque en la tercera prueba, desactivar Hyper-Threading muestra los porcentajes de CPU congelados al 4%, 2%, 3%, 4% en lugar de 3%, 2%, 2% y 2% de la primera prueba.
Por lo tanto, desactivar el hiperprocesamiento parece congelar las CPU virtuales en el estado actual.
Tenga en cuenta que no importa si activa o desactiva Hyper-Threading, el script aún muestra "Hyper Threading Supported".
Bash script para automatizar el encendido / apagado de hyper-threading
Cuando vea el script a continuación, tenga en cuenta que Conky numera las CPU del 1 al 8 pero Linux numera las CPU del 0 al 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: El programa stress
está integrado en todos los sistemas Debian de los que Ubuntu es un derivado. Por lo tanto, no tiene que descargar ni instalar ningún paquete para ejecutar este script en Ubuntu.
Si tiene una CPU de doble núcleo, debe eliminar (o comentar #
) las líneas que controlan los números de CPU 5 y 7.
Crédito a Hi-Angel por la línea bash que grep "" /sys/devices/system/cpu/cpu*/topology/core_id
muestra la topología de la CPU.
Conky se bloquea si Hyper Threading está apagado antes de comenzar
Para obtener las CPU 2, 4, 6, 8 con el menor porcentaje de utilización posible, intenté desactivar Hyper-Threading durante el arranque. Usé este script para hacer eso:
# 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
Sin embargo, se conky
bloquea con un error de segmentación si el hiperprocesamiento se desactiva cuando se inicia. Como tal, tuve que comentar las cuatro @reboot
líneas del guión.
Código Conky para mostrar el porcentaje de utilización de la CPU y el factor de carga
Si está interesado en configurar una pantalla similar en Conky, aquí está el fragmento 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: El código de Nvidia anterior nunca se ha probado porque todavía no tengo la GPU de Nvidia funcionando en Ubuntu. Cualquier año pronto ahora :)