web-dev-qa-db-fra.com

Désactiver l'hyper threading dans Ubuntu

J'exécute le serveur Ubuntu 16.04. Je peux voir que le battage médiatique est activé lorsque j'utilise la commande lscpu.

Je veux le désactiver. Je suis passé par forums Ubunt et ici et ici .

Ce sont de bonnes discussions sur les raisons pour lesquelles l'hyper threading peut ne pas être bon. Mais aucune solution définitive sur la façon de l'éteindre.

Peut-on donner les étapes pour désactiver l'hyperthreading? Merci .

10
john

Introduction

C'est une question intéressante. Probablement l'un des plus intéressants depuis des mois pour moi personnellement. À l'instar de l'OP, il n'existe aucune option pour désactiver Hyper Threading dans mon ancien BIOS (inventé en 2012, mis à jour en 2016 ou à peu près).

Bugs Hyper-Threading dans Intel Skylake et Kaby Lake:

Toute personne utilisant des processeurs Intel Skylake ou de Kaby Lake doit lire les rapports de bogue concernant Hyper Threading qui a fait surface il y a quelques mois. Cette histoire K Register explique comment les développeurs Debian ont découvert comment Hyper Threading pouvait planter et corrompre la machine.

Skylake a signalé de nombreux problèmes dans Ask Ubuntu au cours de la dernière année et on se demande comment identifier les problèmes pouvant avoir été causés par des bogues Hyper Threading.

Cette réponse est divisée en trois parties:

  • Affichage des processeurs lorsque l'hyper-threading est activé/désactivé
  • Script Bash pour automatiser l'activation/désactivation de l'hyper-threading
  • Conky se bloque si Hyper Threading est désactivé avant de commencer

Affichage des processeurs lorsque l'hyper-threading est activé/désactivé

Vous pouvez voir ci-dessous l'utilisation du processeur lorsque l'hyper-threading est désactivé et qu'un test de contrainte du processeur est effectué. Environ 10 secondes plus tard, le même script est répété avec l'hyper threading activé. Enfin, 10 secondes plus tard, le script est exécuté avec l'hyper-threading désactivé à nouveau:

Set Hyper Threading noht

L'affichage est divisé en deux sections:

  • Sur la moitié gauche de la fenêtre du terminal, appelez le script set-hyper-threading avec le paramètre 0 (désactivé), puis 1 (activé).
  • Sur la moitié droite, conkyaffiche le pourcentage d'utilisation du processeur entre CPUS 1 et 8.

Premier script exécuté Hyper Threading

La première fois que le script est exécuté, les numéros de CPU 2, 4, 6 et 8 (selon Conky) sont gelés à 3%, 2%, 2% et 2%. Les nombres de CPU 1, 3, 5 et 7 atteignent 100% pendant l'exécution du test d'effort.

La topologie de la CPU est affichée avec l’hyper-threading désactivé et seuls les quatre cœurs sont signalés:

/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

Deuxième script exécuté Hyper Threading sur

La deuxième fois que le script est exécuté, Hyper-Threading est activé et tous les numéros de CPU 1 à 8 atteignent 100% pendant l'exécution du test de contrainte.

La topologie de la CPU est affichée avec l’hyper-threading activé et seuls les quatre cœurs plus et les quatre cœurs virtuels sont signalés:

/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

Troisième script exécuter Hyper Threading off

Notez qu'après la fin du second script, les UC 2, 4, 6 et 8 sont inactives à 4%, 2%, 3%, 4%. Ceci est important car, dans le troisième test, désactiver Hyper-Threading indique les pourcentages de processeur bloqués à 4%, 2%, 3%, 4% plutôt que 3%, 2%, 2% et 2% à partir du premier test.

Par conséquent, désactiver l'hyper-threading semble simplement geler les processeurs virtuels dans l'état actuel.

Notez également que si vous activez ou désactivez l'hyper-threading, le script affiche toujours "Hyper threading pris en charge".


Script Bash pour automatiser l'activation/désactivation de l'hyper-threading

Lorsque vous consultez le script ci-dessous, gardez à l’esprit que Conky numérote les processeurs de 1 à 8 mais Linux numérote les processeurs de 0 à 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:
#       https://askubuntu.com/questions/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

NOTE: Le programme stressest intégré à tous les systèmes Debian dont Ubuntu est un dérivé. Par conséquent, vous n'avez pas besoin de télécharger et d'installer de paquet pour exécuter ce script dans Ubuntu.

Si vous avez un processeur dual core, vous devez supprimer (ou commenter avec #) les lignes contrôlant les numéros de processeur 5 et 7.

Crédit à Hi-Angel pour la ligne basseh grep "" /sys/devices/system/cpu/cpu*/topology/core_id affichant la topologie de la CPU.


Conky se bloque si Hyper Threading est désactivé avant de commencer

Pour que les processeurs 2, 4, 6, 8 atteignent le pourcentage d'utilisation le plus bas possible, j'ai essayé de désactiver Hyper-Threading lors du démarrage. J'ai utilisé ce script pour faire ça:

# 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:
#       https://askubuntu.com/questions/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

Toutefois, conkyse bloque avec une erreur de segmentation si l'hyper-threading est désactivé au démarrage. En tant que tel, je devais commenter les quatre lignes @reboot du script.

Code Conky pour afficher le pourcentage d'utilisation du processeur et le facteur de charge

Si vous souhaitez configurer un affichage similaire dans Conky, voici l'extrait de code correspondant:

${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}

NOTE: Le code Nvidia ci-dessus n'a jamais été testé, car le GPU Nvidia ne fonctionne pas encore sous Ubuntu. Toute année bientôt maintenant :)

6
WinEunuuchs2Unix

Voici un script pour identifier les cœurs HT et les basculer en ligne/hors ligne.

#!/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 , vous pouvez peut-être ajouter cela à votre excellente réponse.

2
visit1985

Une méthode légèrement plus robuste de recherche dans le noyau des paires hyperthread est nécessaire pour les systèmes où la carte mère héberge plusieurs sockets CPU, car core_id est dupliqué. Voici ma version sur un système avec deux puces Xeon à 8 cœurs (exemple d'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

Pour diverses raisons, vous pouvez également consulter les fichiers.

/sys/devices/system/cpu/present
/sys/devices/system/cpu/online
/sys/devices/system/cpu/offline
1
4dummies

Les noyaux récents supportent maxcpus paramètre du noyau.

Cela vous permet de définir le nombre de processeurs sur le nombre de cœurs physiques. Cela peut être utile pour aider à atténuer les menaces causées par vulnérabilités MDS sur les processeurs Intel de la famille 6.

Comment:

avec les privilèges Sudo (root), ouvrez/etc/default/grub avec votre éditeur de texte préféré.

Recherchez la ligne commençant par GRUB_CMDLINE_LINUX_DEFAULT =

et ajoutez maxcpus = n à tous les paramètres de noyau existants, tels que les paramètres communs de démarrage silencieux (où n = le nombre de cœurs physiques de votre processeur.

Par exemple, sur mon fidèle processeur Intel Core i3-3220 @ 3.30 GHz double cœur avec hyperthreading, j’ai ajouté maxcpus = 2 pour désactiver hyperthreading au démarrage.

Enregistrez le fichier, lancez la commande Sudo update-grub et redémarrez.

Vous pouvez confirmer le succès en lançant la commande lscpu | grep "per core" qui devrait fournir une sortie comme celle-ci:

Thread(s) per core: 1

Testé sur le noyau 4.4.0

Sources:

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

https://unix.stackexchange.com/questions/145645/disabling- cpu-cores-on-quad-core-processor-on-linux

1
Elder Geek

La réponse de @ visit1985 ne fonctionne pas si le séparateur dans thread_siblings_list n'est pas une virgule (ce qui est le cas, par exemple, sur mon système AMD Ryzen).

Voici un script pour désactiver l'hyper-threading qui fonctionne avec n'importe quel séparateur:

#!/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

Et en voici un pour activer l'hyper-threading:

#!/bin/bash

for cpu in /sys/devices/system/cpu/cpu[1-9]*; do
    echo 1 > "$cpu/online"
done
0
Andreas Abel

Si vous avez lu les discussions, vous savez probablement qu'il est généralement déraisonnable de désactiver, donc je suppose que vous le souhaitez à des fins d'apprentissage.

L'idée de HT consiste à avoir plusieurs jeux de registres de CPU pour chaque cœur physique (les soi-disant "cœurs virtuels)>. Il n'y a pas de "meilleur" noyau virtuel, ils sont identiques. Forts de cette connaissance, vous pouvez désactiver les cœurs virtuels, à l’exception d’un pour chaque physique.

Vous voulez d’abord savoir quelle paire de cœurs virtuels appartient à quel cœur physique au système de fichiers /sys/. Vous pouvez utiliser le fichier core_id pour cela:

λ 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

Vous pouvez déduire de la sortie que cpu0 + cpu2 sont contenus dans un noyau physique et cpu1 + cpu3 dans l’autre. Maintenant, élevez les privilèges et utilisez la commande echopour en désactiver un dans chaque paire:

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

Notez que cpu0 n'a pas de fichier "en ligne" et ne peut pas être désactivé, alors j'ai désactivé cpu2 à la place.

0
Hi-Angel