Deshabilitar el subprocesamiento hiper en Ubuntu

14

Estoy ejecutando el servidor ubuntu 16.04. Puedo ver que el subproceso de publicidad se habilita cuando uso el comando lscpu.

Quiero deshabilitarlo Fui a través de foros de ubuntu y aquí y aquí .

Estas son buenas discusiones sobre por qué el hiperprocesamiento puede no ser bueno. Pero no hay una solución definitiva sobre cómo apagarlo.

¿Alguien puede dar los pasos para deshabilitar hyperthreading? Gracias .

John
fuente
3
¿Has intentado deshabilitarlo en el BIOS?
edwinksl
sí, no pude encontrar una opción para HT
juan

Respuestas:

9

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:

Establecer Hyper Threading noht

La pantalla se divide en dos secciones:

  • En la mitad izquierda de la ventana de terminal invocando el script set-hyper-threadingcon el parámetro 0 (apagado) y luego 1 (encendido).
  • En la mitad derecha, se conkymuestra 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 stressestá 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_idmuestra 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 conkybloquea con un error de segmentación si el hiperprocesamiento se desactiva cuando se inicia. Como tal, tuve que comentar las cuatro @rebootlí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 :)

WinEunuuchs2Unix
fuente
1
Lo siento, pero nohtno existe. Incluso busqué la opción a través de las fuentes linux-4.13-rc1 que ocasionalmente tengo. Sin embargo, ciertamente entiendo lo que podría haberlo confundido: dat bugreport se queja de que la opción no funciona, y luego se cierra como nextrelease, como si arreglaran algo. Sin embargo, si lee los comentarios, verá que el único uso de nohtes para un script hecho a mano que verifica la opción en la línea de comando del kernel, luego deshabilita los núcleos a través del /sys/sistema de archivos. IOW nohtes inútil.
Hi-Angel
@ Hola, Angel Gracias por señalar que no es necesario. Hice las pruebas sin él y los núcleos fuera de línea se duplicaron del 2,2,5,5% (con noht) al 5,5,10,10% (sin noht). Haré más pruebas esta noche. Busqué en la documentación de parámetros del kernel y no pude encontrar ninguna referencia noht.
WinEunuuchs2Unix
En la nota al margen, no hay lenguaje de máquina / humano para la indexación :) Para resolver la confusión con índices que comienzan desde 0, 1 o incluso un número particular (como está en MiniZinc) , es mejor pensar en términos de conjuntos de índices , es decir, un surjection de un conjunto de índices a otro conjunto. Al abstraerlo le permite observar más fácilmente cuando algo relevante para un material de datos, que no representa índices, se puede utilizar para indexar después de un poco de giro. La ventaja proviene de tener en mente un concepto independiente de un diseño de memoria y otras limitaciones.
Hi-Angel
@ Hi-Angel Comparación similar entre "Posición de inicio" y "Desplazamiento", supongo. De todos modos, estoy a punto de reescribir esta respuesta en base a los últimos dos días de pruebas y codificación para que nuestros comentarios pronto sean obsoletos ...
WinEunuuchs2Unix
6

Los núcleos recientes admiten el parámetro maxcpus kernel.

Esto le permite establecer el número de cpus en el número de núcleos físicos. Esto puede ser útil para ayudar a mitigar las amenazas causadas por las vulnerabilidades de MDS en las CPU Intel de la familia 6.

Cómo:

con privilegios sudo (root) abra / etc / default / grub con su editor de texto favorito.

Encuentre la línea que comienza con GRUB_CMDLINE_LINUX_DEFAULT =

y agregue maxcpus = n a cualquier parámetro del kernel existente, como los parámetros comunes de splash silencioso (donde n = el número de núcleos físicos que tiene su CPU.

Por ejemplo, en mi confiable Intel (R) Core (TM) i3-3220 CPU @ 3.30GHz dual core con hyperthreading, agregué maxcpus = 2 para desactivar el hyperthreading en el momento del arranque.

Guarde el archivo y luego emita el comando sudo update-gruby reinicie.

Puede confirmar el éxito emitiendo el comando lscpu | grep "per core"que debería proporcionar una salida como esta:

Thread(s) per core: 1

Probado en el kernel 4.4.0

Fuentes:

https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/kernel-parameters.txt

https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/mds.html

/unix/145645/disabling-cpu-cores-on-quad-core-processor-on-linux

Elder Geek
fuente
1
Enlaces interesantes Gracias por compartir.
WinEunuuchs2Unix
@ WinEunuuchs2Unix Un placer. Siempre dispuesto a ayudar!
Élder Geek,
4

Puede deshabilitar hyperthreading en Linux como root o con privilegios de superusuario con:

# echo off > /sys/devices/system/cpu/smt/control

Puede mostrar el estado actual de hyperthreading con:

$ cat /sys/devices/system/cpu/smt/control

Este comando imprime uno de:

on|off|forceoff|notsupported|notimplemented

Alternativamente, la mayoría de los firmwares de BIOS también incluyen una opción para deshabilitar hyperthreading. Si está deshabilitado en el BIOS, el gato anterior probablemente regrese forceoff.

maxschlepzig
fuente
¿Has intentado esto para deshabilitar hyper threading en el arranque?
Élder Geek
1
@ElderGeek no, no he probado el maxcpus=parámetro del núcleo para deshabilitar hyperthreading. Principalmente porque no puedo encontrar ninguna documentación oficial sobre su interacción con núcleos hyperthreading. ¿Se garantiza deshabilitar siempre el hyperthreading si lo especifica maxcpus=#real_cores? ¿O podría terminar con la mitad de los núcleos reales con HT todavía habilitado en algunos sistemas? Además, una maxcpus=configuración no es portátil entre máquinas con diferentes cuentas de núcleos. Mantener variaciones de este parámetro para diferentes máquinas sería tedioso y propenso a errores.
maxschlepzig
En mi experiencia, siempre se ha deshabilitado el hyperthreading si especifica maxcpus = # real_cores, siempre y cuando confíe en la salida de lscpu | grep "per core"Sin embargo, por otro lado, configurar el parámetro del kernel una vez no parece una tarea demasiado onerosa a mi.
Élder Geek
2

Aquí hay un script para identificar los núcleos ht y alternarlos en línea / fuera de línea.

#!/bin/bash
typeset -i core_id
typeset -i sibling_id
typeset -i state

for i in /sys/devices/system/cpu/cpu[0-9]*; do
  core_id="${i##*cpu}"
  sibling_id="-1"

  if [ -f ${i}/topology/thread_siblings_list ]; then
    sibling_id="$(cut -d',' -f1 ${i}/topology/thread_siblings_list)"
  fi

  if [ $core_id -ne $sibling_id ]; then
    state="$(<${i}/online)"
    echo -n "$((1-state))" > "${i}/online"
    echo "switched ${i}/online to $((1-state))"
  fi
done

@ WinEunuuchs2Unix , tal vez puedas agregar esto a tu excelente respuesta.

visita1985
fuente
Tuve que ordenar numéricamente la lista para que funcionara correctamente:for i in $(find /sys/devices/system/cpu/cpu[0-9]* -maxdepth 0 -type d |sort -V); do
neuhaus
2

El maxcpus=nparámetro en GRUB_CMDLINE_LINUX_DEFAULT=no funciona correctamente. Me dejó con 2 núcleos y 4 hilos en lugar de 4 núcleos 4 hilos.

Encontré una solución.

Agregar mitigations=auto,nosmta en su GRUB_CMDLINE_LINUX_DEFAULT=lugar

Probado en Ubuntu 16.04 LTS con Linux 4.4.0.

Fuente: https://wiki.ubuntu.com/SecurityTeam/KnowledgeBase/MDS

MobTactics
fuente
1

Se necesita una forma un poco más sólida de buscar en el núcleo pares de hyperthread para los sistemas en los que la placa base aloja múltiples zócalos de CPU porque core_id está duplicado. Aquí está mi versión en un sistema con dos chips Xeon de 8 núcleos (ejemplo de Ubuntu 16.04):

$ cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list \
> | sort --unique --numeric-sort
0,16
1,17
2,18
3,19
4,20
5,21
6,22
7,23
8,24
9,25
10,26
11,27
12,28
13,29
14,30
15,31

Para varios propósitos, es posible que también desee buscar en los archivos

/sys/devices/system/cpu/present
/sys/devices/system/cpu/online
/sys/devices/system/cpu/offline
4dummies
fuente
0

Si ha leído las discusiones, entonces probablemente sepa que, por lo general, no es razonable deshabilitarlas, por lo que supongo que lo desea con fines de aprendizaje.

La idea de HT es tener múltiples conjuntos de registros de CPU para cada núcleo físico (los llamados núcleos virtuales) . No hay un núcleo virtual "mejor", son idénticos. Armado con este conocimiento, puede deshabilitar los núcleos virtuales, excepto uno para cada físico.

Primero, desea saber qué par de núcleos virtuales pertenecen a qué núcleo físico en el /sys/sistema de archivos. Puede usar el core_idarchivo para eso:

λ grep "" /sys/devices/system/cpu/cpu*/topology/core_id
/sys/devices/system/cpu/cpu0/topology/core_id:0
/sys/devices/system/cpu/cpu1/topology/core_id:2
/sys/devices/system/cpu/cpu2/topology/core_id:0
/sys/devices/system/cpu/cpu3/topology/core_id:2

De la salida se puede inferir que cpu0 + cpu2 están contenidos en un núcleo físico y cpu1 + cpu3 en el otro. Ahora eleve los privilegios y use el echocomando para deshabilitar uno en cada par:

λ sudo -s
# echo 0 > /sys/devices/system/cpu/cpu1/online
# echo 0 > /sys/devices/system/cpu/cpu2/online

Tenga en cuenta que cpu0 no tiene un archivo "en línea" y no se puede deshabilitar, por lo que deshabilité cpu2 en su lugar.

Hola angel
fuente
0

La respuesta de @ visit1985 no funciona si el separador en thread_siblings_list no es una coma (que es, por ejemplo, el caso en mi sistema AMD Ryzen).

Aquí hay un script para desactivar el hiperprocesamiento que funciona con cualquier separador:

#!/bin/bash

for cpu in /sys/devices/system/cpu/cpu[1-9]*; do
    if [ -e "$cpu/topology/thread_siblings_list" ]; then
        sibling=$(awk -F '[^0-9]' '{ print $2 }' $cpu/topology/thread_siblings_list)
        if [ ! -z $sibling ]; then
            echo 0 > "/sys/devices/system/cpu/cpu$sibling/online"
        fi
    fi
done

Y aquí hay uno para activar Hyper-Threading:

#!/bin/bash

for cpu in /sys/devices/system/cpu/cpu[1-9]*; do
    echo 1 > "$cpu/online"
done
Andreas Abel
fuente
¿ Funciona este método en su CPU Ryzen?
Élder Geek