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:
Die Anzeige ist in zwei Bereiche unterteilt:
- In der linken Hälfte des Terminalfensters wird das Skript
set-hyper-threading
mit den Parametern 0 (aus) und dann 1 (ein) aufgerufen.
- In der rechten Hälfte
conky
wird 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 stress
ist 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_id
Anzeige 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 conky
stürzt mit einem Segmentierungsfehler , wenn Hyper-Threading ausgeschaltet wird , wenn er startet. Als solches musste ich die vier @reboot
Zeilen 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 :)