Wprowadzenie
To interesujące pytanie. Prawdopodobnie jeden z najciekawszych od miesięcy dla mnie osobiście. Podobnie jak OP, nie ma opcji wyłączenia Hyper Threading w moim starym BIOS-ie (wynaleziony w 2012 r., Zaktualizowany w 2016 r. Lub mniej więcej).
Błędy hiperwątkowości w Intel Skylake i Kaby Lake:
Każdy, kto korzysta z procesorów Intel Skylake lub Kaby Lake , musi przeczytać raporty o błędach dotyczące Hyper Threading, które pojawiły się kilka miesięcy temu. Ta historia z rejestru brytyjskiego wyjaśnia, w jaki sposób deweloperzy Debiana zauważyli, jak Hyper Threading może spowodować awarię i uszkodzenie maszyny.
Istnieje wiele problemów ze Skylake zgłoszonych w Ask Ubuntu w ciągu ostatniego roku i zastanawia się, jak rozpoznać, które problemy mogły być spowodowane błędami Hyper Threading.
Ta odpowiedź jest podzielona na trzy części:
- Wyświetlanie procesorów, gdy Hyper-Threading jest wyłączony / włączony
- Skrypt Bash do automatyzacji wyłączania / włączania hiperwątkowości
- Conky ulega awarii, jeśli Hyper Threading jest wyłączony przed rozpoczęciem
Wyświetlanie procesorów, gdy Hyper-Threading jest wyłączony / włączony
Poniżej widać wykorzystanie procesora, gdy hiperwątkowanie jest wyłączone i wykonywany jest test obciążenia procesora. Około 10 sekund później ten sam skrypt jest powtarzany przy włączonym hiperwątkowości. Wreszcie 10 sekund po uruchomieniu skryptu przy wyłączonym hiperwątkowości:
Wyświetlacz jest podzielony na dwie sekcje:
- W lewej połowie okna terminala wywołuje skrypt
set-hyper-threading
z parametrem 0 (wyłączony), a następnie 1 (włączony).
- Po prawej stronie
conky
wyświetla procent wykorzystania procesora przez CPUS od 1 do 8.
Pierwszy skrypt wyłącza Hyper Threading
Przy pierwszym uruchomieniu skryptu Procesory 2, 4, 6 i 8 (według Conky) są zamrożone na 3%, 2%, 2% i 2%. Liczby procesora 1, 3, 5 i 7 zwiększają się do 100% podczas testu warunków skrajnych.
Topologia procesora jest wyświetlana z wyłączonym hiperwątkowością i zgłaszane są tylko cztery rdzenie:
/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
Drugi skrypt włącza Hyper Threading
Przy drugim uruchomieniu skryptu funkcja Hyper-Threading jest włączona, a wszystkie liczby procesorów 1-8 zwiększają się do 100% podczas testu warunków skrajnych.
Topologia procesora jest wyświetlana z włączonym hiperwątkowością i zgłaszane są tylko cztery rdzenie plus i cztery rdzenie wirtualne:
/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
Trzeci skrypt uruchamia Hyper Threading
Zwróć uwagę, jak po zakończeniu drugiego skryptu procesory 2, 4, 6 i 8 pracują na biegu jałowym przy 4%, 2%, 3%, 4%. Jest to ważne, ponieważ w trzecim teście wyłączenie funkcji Hyper-Threading pokazuje te procenty zamrożone przy 4%, 2%, 3%, 4% zamiast 3%, 2%, 2% i 2% od pierwszego testu.
Dlatego wyłączenie hiperwątkowości wydaje się po prostu zamrażać procesory wirtualne w bieżącym stanie.
Pamiętaj również, bez względu na to, czy włączysz lub wyłączysz Hyper-Threading, skrypt nadal wyświetla „Obsługiwane Hyper-Threading”.
Skrypt Bash do automatyzacji wyłączania / włączania hiperwątkowości
Przeglądając poniższy skrypt pamiętaj, że Conky numeruje procesory od 1 do 8, ale Linux numeruje procesory od 0 do 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
UWAGA: Program stress
jest wbudowany we wszystkie systemy Debian, których Ubuntu jest pochodną. Dlatego nie musisz pobierać ani instalować żadnych pakietów, aby uruchomić ten skrypt w Ubuntu.
Jeśli masz dwurdzeniowy procesor, musisz usunąć (lub skomentować #
) linie kontrolujące procesor o numerach 5 i 7.
Podziękowania dla Hi-Angel za linię bashową grep "" /sys/devices/system/cpu/cpu*/topology/core_id
wyświetlającą topologię procesora.
Conky ulega awarii, jeśli Hyper Threading jest wyłączony przed rozpoczęciem
Aby maksymalnie wykorzystać procesory 2, 4, 6, 8, próbowałem wyłączyć Hyper-Threading podczas uruchamiania. Użyłem tego skryptu, aby to zrobić:
# 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
Jednak conky
ulega awarii z błędem segmentacji, jeśli hiperwątkowanie jest wyłączone podczas uruchamiania. Jako taki musiałem skomentować cztery @reboot
linie w skrypcie.
Conky Code do wyświetlania procentu wykorzystania procesora i współczynnika obciążenia
Jeśli chcesz skonfigurować podobny ekran w Conky, oto odpowiedni fragment kodu:
${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}
UWAGA: Powyższy kod Nvidia nigdy nie był testowany, ponieważ nie mam jeszcze procesora graficznego Nvidia działającego pod Ubuntu. Już niedługo rok :)