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 .
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).
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.
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:
L'affichage est divisé en deux sections:
set-hyper-threading
avec le paramètre 0 (désactivé), puis 1 (activé).conky
affiche le pourcentage d'utilisation du processeur entre CPUS 1 et 8.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
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
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".
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 stress
est 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.
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, conky
se 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.
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 :)
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.
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
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
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
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 echo
pour 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.