Deaktivieren Sie Hyper-Threading in Ubuntu

12

Ich verwende Ubuntu 16.04 Server. Ich kann sehen, dass Hype-Threading aktiviert ist, wenn ich den Befehl lscpu verwende.

Ich möchte es deaktivieren. Ich ging durch Ubuntu-Foren und hier und hier .

Dies sind gute Diskussionen, warum Hyper-Threading möglicherweise nicht gut ist. Aber keine endgültige Lösung, wie man es ausschaltet.

Kann jemand die Schritte zum Deaktivieren von Hyperthreading angeben? Vielen Dank .

John
quelle
3
Haben Sie versucht, es im BIOS zu deaktivieren?
Edwinksl
Ja, konnte keine Option für HT finden
John

Antworten:

8

Einführung

Dies ist eine interessante Frage. Wahrscheinlich eines der interessantesten seit Monaten für mich persönlich. Wie beim OP gibt es in meinem alten BIOS (erfunden 2012, aktualisiert 2016 oder so) keine Option zum Deaktivieren von Hyper-Threading.

Hyper-Threading-Fehler in Intel Skylake und Kaby Lake:

Jeder, der Intel Skylake- oder Kaby Lake- Prozessoren verwendet, muss die Fehlerberichte über Hyper-Threading lesen, die vor einigen Monaten aufgetaucht sind. In dieser UK Register- Geschichte wird beschrieben, wie Debian-Entwickler entdeckt haben, wie Hyper-Threading abstürzen und den Computer beschädigen kann.

In Ask Ubuntu wurden im letzten Jahr zahlreiche Probleme mit Skylake gemeldet, und man fragt sich, wie man erkennt, welche Probleme möglicherweise durch Hyper-Threading-Fehler verursacht wurden.

Diese Antwort gliedert sich in drei Teile:

  • Anzeige der CPUs beim Ein- und Ausschalten von Hyper-Threading
  • Bash-Skript zum automatischen Ein- und Ausschalten von Hyper-Threading
  • Conky stürzt ab, wenn das Hyper-Threading vor dem Start deaktiviert ist

Anzeige der CPUs beim Ein- und Ausschalten von Hyper-Threading

Unten sehen Sie die CPU-Auslastung, wenn das Hyper-Threading deaktiviert und ein CPU-Stresstest durchgeführt wird. Ungefähr 10 Sekunden später wird dasselbe Skript mit aktiviertem Hyper-Threading wiederholt. 10 Sekunden später wird das Skript mit wieder deaktiviertem Hyper-Threading ausgeführt:

Stellen Sie Hyper Threading noht ein

Die Anzeige ist in zwei Bereiche unterteilt:

  • In der linken Hälfte des Terminalfensters wird das Skript set-hyper-threadingmit den Parametern 0 (aus) und dann 1 (ein) aufgerufen.
  • In der rechten Hälfte conkywird die prozentuale CPU-Auslastung von CPUS 1 bis 8 angezeigt.

Führen Sie im ersten Skript Hyper Threading aus

Beim ersten Ausführen des Skripts werden die CPU-Nummern 2, 4, 6 und 8 (laut Conky) mit 3%, 2%, 2% und 2% eingefroren. Die CPU-Nummern 1, 3, 5 und 7 steigen während des Stresstests auf 100%.

Die CPU-Topologie wird mit deaktiviertem Hyper-Threading angezeigt und nur die vier Kerne werden gemeldet:

/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

Das zweite Skript führt Hyper Threading aus

Beim zweiten Ausführen des Skripts wird Hyper-Threading aktiviert und alle CPU-Nummern 1-8 werden während des Stresstests auf 100% erhöht.

Die CPU-Topologie wird mit aktiviertem Hyper-Threading angezeigt und nur die vier Kerne plus und vier virtuelle Kerne werden gemeldet:

/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

Das dritte Skript führt Hyper Threading aus

Beachten Sie, dass die CPUs 2, 4, 6 und 8 nach dem Ende des zweiten Skripts bei 4%, 2%, 3%, 4% im Leerlauf sind. Dies ist wichtig, da beim Ausschalten von Hyper-Threading im dritten Test die CPU-Prozentsätze beim ersten Test auf 4%, 2%, 3%, 4% anstatt auf 3%, 2%, 2% und 2% eingefroren werden.

Daher scheint das Deaktivieren von Hyper-Threading die virtuellen CPUs im aktuellen Zustand nur einzufrieren.

Beachten Sie auch, dass unabhängig davon, ob Sie Hyper-Threading aktivieren oder deaktivieren, das Skript weiterhin "Hyper-Threading unterstützt" anzeigt.


Bash-Skript zum automatischen Ein- und Ausschalten von Hyper-Threading

Beachten Sie beim Anzeigen des folgenden Skripts, dass Conky die CPUs von 1 bis 8 nummeriert, Linux jedoch die CPUs von 0 bis 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

HINWEIS: Das Programm stressist in alle Debian-Systeme integriert, von denen Ubuntu abgeleitet ist. Daher müssen Sie keine Pakete herunterladen und installieren, um dieses Skript in Ubuntu auszuführen.

Wenn Sie eine Dual-Core-CPU haben, müssen Sie #die Zeilen, die die CPU-Nummern 5 und 7 steuern , entfernen (oder auskommentieren ).

Dank an Hi-Angel für die Bash-Zeile mit der grep "" /sys/devices/system/cpu/cpu*/topology/core_idAnzeige der CPU-Topologie.


Conky stürzt ab, wenn das Hyper-Threading vor dem Start deaktiviert ist

Um die CPUs 2, 4, 6, 8 auf die niedrigstmögliche Auslastung zu bringen, habe ich versucht, Hyper-Threading während des Startvorgangs zu deaktivieren. Ich habe dieses Skript verwendet, um das zu tun:

# 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

Jedoch conkystürzt mit einem Segmentierungsfehler , wenn Hyper-Threading ausgeschaltet wird , wenn er startet. Als solches musste ich die vier @rebootZeilen im Skript auskommentieren.

Conky-Code zur Anzeige der prozentualen CPU-Auslastung und des Auslastungsfaktors

Wenn Sie daran interessiert sind, eine ähnliche Anzeige in Conky einzurichten, finden Sie hier den entsprechenden Codeausschnitt:

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

HINWEIS: Der obige Nvidia-Code wurde noch nie getestet, da die Nvidia-GPU unter Ubuntu noch nicht funktioniert. Jedes Jahr bald :)

WinEunuuchs2Unix
quelle
1
Entschuldigung, existiert aber nohtnicht. Ich habe sogar nach der Option über Linux-4.13-rc1-Quellen gesucht, die ich gelegentlich habe. Ich verstehe jedoch auf jeden Fall , was Sie verwirrt haben könnte: dat bugreport beschwert sich, dass die Option nicht funktioniert, und dann wird sie geschlossen, als nextreleaseob sie etwas repariert hätten . Wenn Sie jedoch die Kommentare lesen, werden Sie feststellen, dass nur nohtein handgefertigtes Skript verwendet wird, das die Kernel-Befehlszeile auf die Option überprüft und dann die Kerne über das /sys/Dateisystem deaktiviert . IOW nohtist nutzlos.
Hi-Angel
@ Hi-Angel Danke für den Hinweis, dass es nicht notwendig ist. Ich habe ohne getestet und die Offline-Kerne verdoppelten sich von 2,2,5,5% (mit Noht) auf 5,5,10,10% (ohne Noht). Ich werde heute Abend weitere Tests durchführen. Ich habe die Kernel-Parameterdokumentation durchsucht und konnte keinen Verweis auf finden noht.
WinEunuuchs2Unix
Auf Seite beachten, gibt es keine Maschine / Die menschliche Sprache zu Indizierungs :) zu lösen Verwirrung mit den Indizes ausgehend von 0, 1 oder sogar eine bestimmte Anzahl (wie es in MiniZinc ist) , ist es im Hinblick auf die denken , besser Indexmengen , dh ein Surjektion von einem Satz von Indizes zu einem anderen Satz. Wenn Sie es weg abstrahieren, können Sie leichter feststellen, ob einige relevante Daten, die keine Indizes darstellen, tatsächlich für die Indizierung verwendet werden können, nachdem Sie ein wenig herumgedreht haben. Der Vorteil ergibt sich aus der Berücksichtigung eines Konzepts, das nicht an ein Speicherlayout und andere Einschränkungen gebunden ist.
Hi-Angel
@ Hi-Angel Ähnlicher Vergleich zwischen "Startposition" und "Offset", denke ich. Wie auch immer, ich werde diese Antwort basierend auf den letzten zwei Tagen des Testens und Codierens neu schreiben, damit unsere Kommentare bald veraltet sind ...
WinEunuuchs2Unix
6

Aktuelle Kernel unterstützen den Parameter maxcpus kernel.

Auf diese Weise können Sie die Anzahl der CPUs auf die Anzahl der physischen Kerne einstellen. Dies kann hilfreich sein, um Bedrohungen durch MDS-Schwachstellen auf Intel-CPUs aus Familie 6 zu mindern .

Wie:

Öffnen Sie mit sudo (root) Berechtigungen / etc / default / grub mit Ihrem bevorzugten Texteditor.

Suchen Sie die Zeile, die mit GRUB_CMDLINE_LINUX_DEFAULT = beginnt

und fügen Sie maxcpus = n zu allen vorhandenen Kernel-Parametern hinzu, z. B. den allgemeinen stillen Splash- Parametern (wobei n = die Anzahl der physischen Kerne Ihrer CPU ist).

Zum Beispiel habe ich auf meiner vertrauenswürdigen Intel (R) Core (TM) i3-3220-CPU mit 3,30 GHz Dual Core und Hyperthreading maxcpus = 2 hinzugefügt , um das Hyperthreading beim Booten zu deaktivieren .

Speichern Sie die Datei, geben Sie den Befehl ein sudo update-grubund starten Sie den Computer neu.

Sie können den Erfolg bestätigen, indem Sie den Befehl lscpu | grep "per core"eingeben, der folgende Ausgabe liefern soll:

Thread(s) per core: 1

Getestet auf Kernel 4.4.0

Quellen:

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
quelle
1
Interessante Links. Danke für das Teilen.
WinEunuuchs2Unix
@ WinEunuuchs2Unix Es war mir ein Vergnügen. Immer bereit zu helfen!
Elder Geek
3

Sie können Hyperthreading unter Linux als Root oder mit Superuser-Berechtigungen deaktivieren mit:

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

Sie können den aktuellen Hyperthreading-Status anzeigen mit:

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

Dieser Befehl gibt Folgendes aus:

on|off|forceoff|notsupported|notimplemented

Alternativ enthalten die meisten BIOS-Firmwares auch eine Option zum Deaktivieren von Hyperthreading. Wenn es im BIOS deaktiviert ist, kehrt die obige Katze wahrscheinlich zurück forceoff.

maxschlepzig
quelle
Haben Sie versucht , diese zu deaktivieren Hyper - Threading beim Booten?
Elder Geek
@ElderGeek nein, ich habe den maxcpus=Kernel-Parameter zum Deaktivieren von Hyperthreading nicht ausprobiert . Hauptsächlich, weil ich keine offizielle Dokumentation über die Interaktion mit Hyperthreading-Kernen finden kann. Wird das Hyperthreading garantiert immer deaktiviert, wenn Sie dies angeben maxcpus=#real_cores? Oder haben Sie möglicherweise die Hälfte der Real-Cores, bei denen HT auf einigen Systemen noch aktiviert ist? Außerdem ist eine maxcpus=Einstellung nicht zwischen Maschinen mit unterschiedlichen Kernzahlen portierbar. Das Beibehalten von Variationen dieses Parameters für verschiedene Maschinen wäre mühsam und fehleranfällig.
Maxschlepzig
Nach meiner Erfahrung ist , hat immer deaktiviert Hyperthreading , wenn Sie angeben maxcpus = # real_cores natürlich vorausgesetzt , dass Sie die Ausgabe Vertrauen lscpu | grep "per core"aber Sie einen vaild Punkt in Bezug auf Portabilität machen, auf der Kehrseite einmal die Kernel - Parameter Einstellung scheinen nicht zu belastend eine Aufgabe mir.
Elder Geek
2

Hier ist ein Skript, um die ht-Kerne zu identifizieren und sie online / offline umzuschalten.

#!/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 , vielleicht können Sie dies zu Ihrer ausgezeichneten Antwort hinzufügen.

visit1985
quelle
Ich musste die Liste numerisch sortieren, damit sie richtig funktioniert: for i in $(find /sys/devices/system/cpu/cpu[0-9]* -maxdepth 0 -type d |sort -V); do
Neuhaus
1

Für Systeme, in denen das Motherboard mehrere CPU-Sockel hostet, ist eine etwas robustere Methode erforderlich, um im Kernel nach Hyperthread-Paaren zu suchen, da core_id dupliziert wird. Hier ist meine Version auf einem System mit zwei 8-Kern-Xeon-Chips (Beispiel aus 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

Für verschiedene Zwecke möchten Sie möglicherweise auch in den Dateien suchen

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

Der maxcpus=nParameter in GRUB_CMDLINE_LINUX_DEFAULT=funktioniert nicht richtig. Ich hatte 2 Kerne und 4 Fäden anstelle von 4 Kernen und 4 Fäden.

Ich habe eine Lösung gefunden.

In mitigations=auto,nosmtzu GRUB_CMDLINE_LINUX_DEFAULT=statt

Getestet unter Ubuntu 16.04 LTS mit Linux 4.4.0.

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

MobTactics
quelle
0

Wenn Sie Diskussionen gelesen haben, wissen Sie wahrscheinlich, dass das Deaktivieren normalerweise nicht zumutbar ist. Ich gehe also davon aus, dass Sie es zu Lernzwecken möchten.

Die Idee von HT besteht darin, mehrere Sätze von CPU-Registern für jeden physischen Kern (die sogenannten virtuellen Kerne) zu haben. . Es gibt keinen "besseren" virtuellen Kern, sie sind identisch. Mit diesem Wissen können Sie virtuelle Kerne außer einem für jeden physischen deaktivieren.

Zuerst möchten Sie wissen, welches Paar virtueller Kerne zu welchem ​​physischen Kern im /sys/Dateisystem gehört. Sie können die core_idDatei dafür verwenden:

λ 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

Aus der Ausgabe können Sie schließen, dass cpu0 + cpu2 in einem physischen Kern und cpu1 + cpu3 im anderen enthalten sind. Erhöhen Sie nun die Berechtigungen und echodeaktivieren Sie mit jedem Befehl eines in jedem Paar:

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

Beachten Sie, dass cpu0 keine "Online" -Datei hat und nicht deaktiviert werden kann. Daher habe ich stattdessen cpu2 deaktiviert.

Hallo Engel
quelle
0

Die Antwort von @ visit1985 funktioniert nicht, wenn das Trennzeichen in thread_s Geschwisters_list kein Komma ist (was beispielsweise auf meinem AMD Ryzen-System der Fall ist).

Hier ist ein Skript zum Deaktivieren von Hyper-Threading, das mit jedem Trennzeichen funktioniert:

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

Und hier ist eine, die das Hyper-Threading aktiviert:

#!/bin/bash

for cpu in /sys/devices/system/cpu/cpu[1-9]*; do
    echo 1 > "$cpu/online"
done
Andreas Abel
quelle
Funktioniert diese Methode auf Ihrer Ryzen-CPU?
Elder Geek