Désactiver l'hyper threading dans Ubuntu

14

J'utilise le serveur Ubuntu 16.04. Je peux voir que le filetage hype est activé lorsque j'utilise la commande lscpu.

Je veux le désactiver. J'ai parcouru les forums ubuntu et ici et ici .

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

Quelqu'un peut-il donner les étapes pour désactiver l'hyperthreading? Merci .

John
la source
3
Avez-vous essayé de le désactiver dans le BIOS?
edwinksl
oui, impossible de trouver une option pour HT
john

Réponses:

9

introduction

C'est une question intéressante. Probablement l'un des plus intéressants depuis des mois pour moi personnellement. Comme l'OP, il n'y a pas d'option pour désactiver Hyper Threading dans mon ancien BIOS (inventé en 2012, mis à jour en 2016 environ).

Bugs hyper-threading dans Intel Skylake et Kaby Lake:

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

Il y a de nombreux problèmes avec Skylake signalés dans Ask Ubuntu au cours de la dernière année et on se demande comment discerner quels problèmes peuvent avoir été causés par des bogues Hyper Threading.

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

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

Affichage des processeurs lorsque Hyper-Threading est activé / désactivé

Ci-dessous, vous pouvez voir l'utilisation du processeur lorsque l'hyper-threading est désactivé et qu'un test de stress 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 après, le script est exécuté avec l'hyper-threading désactivé à nouveau:

Définir l'hyper threading noht

L'affichage est divisé en deux sections:

  • Sur la moitié gauche la fenêtre du terminal invoquant le script set-hyper-threadingavec le paramètre 0 (off) puis 1 (on).
  • Sur la moitié droite conkys'affiche le pourcentage d'utilisation du processeur de CPUS 1 à 8.

Premier script exécutant Hyper Threading off

La première fois que le script est exécuté, les CPU 2, 4, 6 et 8 (selon Conky) sont figés à 3%, 2%, 2% et 2%. Les nombres CPU 1, 3, 5 et 7 atteignent 100% pendant le test de stress.

La topologie du processeur s'affiche avec l'hyper-threading désactivé et seuls les quatre cœurs ont signalé:

/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écutant 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 augmentent à 100% pendant l'exécution du test de stress.

La topologie du processeur est affichée avec l'hyper-threading activé et seuls les quatre cœurs plus et quatre cœurs virtuels ont été 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

Le troisième script exécute Hyper Threading off

Notez comment, après la fin du deuxième script, les CPU 2, 4, 6 et 8 tournent au ralenti à 4%, 2%, 3%, 4%. Ceci est important car dans le troisième test, la désactivation de Hyper-Threading montre les pourcentages CPU gelés à 4%, 2%, 3%, 4% plutôt que 3%, 2%, 2% et 2% du premier test.

Par conséquent, la désactivation de l'hyper-threading semble simplement geler les processeurs virtuels à l'état actuel.

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


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

Lors de la visualisation du script ci-dessous, gardez à l'esprit que Conky numérote les CPU de 1 à 8 mais Linux numérote les CPU 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:
#       /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

REMARQUE: 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 packages pour exécuter ce script dans Ubuntu.

Si vous avez un processeur double cœur, vous devez supprimer (ou commenter #) les lignes contrôlant les numéros de processeur 5 et 7.

Nous remercions Hi-Angel pour la ligne bash grep "" /sys/devices/system/cpu/cpu*/topology/core_idaffichant la topologie CPU.


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

Pour obtenir les CPU 2, 4, 6, 8 au plus bas pourcentage d'utilisation possible, j'ai essayé de désactiver Hyper-Threading pendant le démarrage. J'ai utilisé ce script pour cela:

# 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

Cependant se conkybloque avec une erreur de segmentation si l'hyper-threading est désactivé au démarrage. En tant que tel, j'ai dû commenter les quatre @rebootlignes 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}

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

WinEunuuchs2Unix
la source
1
Désolé, mais nohtn'existe pas. J'ai même recherché l'option via des sources linux-4.13-rc1 que je possède parfois. Cependant, je comprends certainement ce qui aurait pu vous embrouiller: dat bugreport se plaint que l'option ne fonctionne pas, puis elle est fermée comme nextrelease, comme s'ils corrigeaient quelque chose. Cependant, si vous lisez les commentaires, vous verrez que la seule utilisation de nohtest pour un script fabriqué à la main qui vérifie la ligne de commande du noyau pour l'option, puis désactive les cœurs via le /sys/système de fichiers. IOW nohtest inutile.
Hi-Angel
@ Hi-Angel Merci d'avoir souligné que ce n'est pas nécessaire. J'ai fait des tests sans et les cœurs hors ligne ont doublé, passant de 2,2,5,5% (avec noht) à 5,5,10,10% (sans noht). Je ferai plus de tests ce soir. J'ai cherché dans la documentation des paramètres du noyau et je n'ai trouvé aucune référence à noht.
WinEunuuchs2Unix
En passant, il n'y a pas de langage Machine / Humain à indexer :) Pour résoudre la confusion avec les index à partir de 0, 1, ou même un nombre particulier (comme c'est le cas en MiniZinc) , il est préférable de penser en termes d' ensembles d'index , c'est-à-dire un surjection d'un ensemble d'indices à un autre ensemble. Le résumer vous permet de noter plus facilement quand certains éléments pertinents pour un élément de données, qui ne représentent pas des indices, peuvent en fait être utilisés pour l'indexation après avoir été un peu tordus. L'avantage vient d'avoir à l'esprit un concept non lié à une disposition de mémoire et d'autres limitations.
Hi-Angel
@ Hi-Angel Comparaison similaire entre "Position de départ" et "Décalage" je suppose. Quoi qu'il en soit, je suis sur le point de réécrire cette réponse sur la base des deux derniers jours de tests et de codage, donc nos commentaires seront bientôt obsolètes ...
WinEunuuchs2Unix
6

Les noyaux récents prennent en charge le paramètre de noyau maxcpus .

Cela vous permet de définir le nombre de cpus sur le nombre de cœurs physiques. Cela peut être utile pour atténuer les menaces causées par les 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é.

Trouvez la ligne qui commence par GRUB_CMDLINE_LINUX_DEFAULT =

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

Par exemple, sur mon fidèle processeur Intel (R) Core (TM) i3-3220 à 3,30 GHz double cœur avec hyperthreading, j'ai ajouté maxcpus = 2 pour désactiver l'hyperthreading au démarrage.

Enregistrez le fichier, puis exécutez la commande sudo update-grubet redémarrez.

Vous pouvez confirmer le succès en exécutant 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

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

Elder Geek
la source
1
Liens intéressants. Merci d'avoir partagé.
WinEunuuchs2Unix
@ WinEunuuchs2Unix Mon plaisir. Toujours désireux d'aider!
Elder Geek
4

Vous pouvez désactiver l'hyperthreading sous Linux en tant que root ou avec des privilèges de superutilisateur avec:

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

Vous pouvez afficher l' état d'hyperthreading actuel avec:

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

Cette commande imprime l'un des éléments suivants:

on|off|forceoff|notsupported|notimplemented

Alternativement, la plupart des firmwares du BIOS incluent également une option pour désactiver l'hyperthreading. S'il est désactivé dans le BIOS, le chat ci-dessus revient probablement forceoff.

maxschlepzig
la source
Avez-vous essayé cela pour désactiver l'hyper threading au démarrage?
Elder Geek
1
@ElderGeek non, je n'ai pas essayé le maxcpus=paramètre du noyau pour désactiver l'hyperthreading. Principalement parce que je ne trouve aucune documentation officielle sur son interaction avec les cœurs hyperthreading. Est-il garanti de toujours désactiver l'hyperthreading si vous le spécifiez maxcpus=#real_cores? Ou pourriez-vous vous retrouver avec la moitié des cœurs réels avec HT toujours activé sur certains systèmes? De plus, un maxcpus=paramètre n'est pas portable entre des machines avec différents nombres de cœurs. Le maintien des variations de ce paramètre pour différentes machines serait fastidieux et sujet aux erreurs.
maxschlepzig
D'après mon expérience, il a toujours désactivé l'hyperthreading si vous spécifiez maxcpus = # real_cores à condition bien sûr que vous ayez confiance en la sortie de lscpu | grep "per core"Vous faites un point de vaild concernant la portabilité cependant, d'un autre côté, définir le paramètre du noyau une fois ne semble pas une tâche trop onéreuse tome.
Elder Geek
2

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 ceci à votre excellente réponse.

visite1985
la source
J'ai dû trier numériquement la liste pour la faire fonctionner correctement:for i in $(find /sys/devices/system/cpu/cpu[0-9]* -maxdepth 0 -type d |sort -V); do
neuhaus
2

Le maxcpus=nparamètre dans GRUB_CMDLINE_LINUX_DEFAULT=ne fonctionne pas correctement. Il m'a laissé 2 cœurs et 4 fils au lieu de 4 cœurs 4 fils.

J'ai trouvé une solution.

Ajouter mitigations=auto,nosmtà la GRUB_CMDLINE_LINUX_DEFAULT=place

Testé sur Ubuntu 16.04 LTS avec Linux 4.4.0.

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

MobTactics
la source
1

Une façon un peu plus robuste de rechercher dans le noyau des paires d'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

À diverses fins, vous pouvez également consulter les fichiers

/sys/devices/system/cpu/present
/sys/devices/system/cpu/online
/sys/devices/system/cpu/offline
4dummies
la source
0

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 est d'avoir plusieurs ensembles de registres CPU pour chaque cœur physique (les soi-disant cœurs virtuels) . Il n'y a pas de "meilleur" noyau virtuel, ils sont identiques. Armé de cette connaissance, vous pouvez désactiver les cœurs virtuels, sauf un pour chaque physique.

Vous voulez d'abord savoir quelle paire de cœurs virtuels appartient à quel cœur physique du /sys/système de fichiers. Vous pouvez utiliser le core_idfichier 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

À partir de la sortie, vous pouvez déduire que cpu0 + cpu2 sont contenus dans un noyau physique et cpu1 + cpu3 dans l'autre. Maintenant, élevez les privilèges et utilisez la echocommande pour 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é, j'ai donc désactivé cpu2 à la place.

Salut ange
la source
0

La réponse de @ visit1985 ne fonctionne pas si le séparateur dans thread_siblings_list n'est pas une virgule (ce qui est, par exemple, le cas 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
Andreas Abel
la source
Cette méthode fonctionne- t - elle sur votre processeur Ryzen?
Elder Geek