Вступ
Це цікаве питання. Напевно, один із найцікавіших за кілька місяців для мене особисто. Як і у OP, немає можливості вимкнути Hyper Threading у моїй старій BIOS (винайдено 2012, оновлено 2016 чи так).
Помилки Hyper-Threading в Intel Skylake та Kaby Lake:
Усі, хто використовує процесори Intel Skylake або Kaby Lake, повинні прочитати звіти про помилки щодо Hyper Threading, які з’явилися пару місяців тому. Ця історія з реєстрації у Великобританії розповідає про те, як розробники Debian помітили, як Hyper Threading може вийти з ладу та пошкодити машину.
Існує чимало проблем із Skylake, про які повідомлялося в Ask Ubuntu за останній рік, і задається питанням, як визначити, які проблеми могли бути викликані помилками Hyper Threading.
Ця відповідь розділена на три частини:
- Відображення процесорів, коли Hyper-Threading вимкнено / увімкнено
- Bash-скрипт для автоматичного відключення / вмикання гіпер-ниток
- Conky Crashes, якщо Hyper Threading вимкнено перед його запуском
Відображення процесорів, коли Hyper-Threading вимкнено / увімкнено
Нижче ви можете побачити використання процесора, коли вимкнено гіпернарізку та виконується стрес-тест процесора. Приблизно через 10 секунд той самий сценарій повторюється із увімкненою гіпер-ниткою. Нарешті через 10 секунд після цього сценарій запускається з гіпер-потоком, вимкненим знову:
Дисплей розділений на два розділи:
- У лівій половині вікна терміналу викликається сценарій
set-hyper-threading
з параметром 0 (вимкнено), а потім 1 (увімкнено).
- Права половина
conky
відображає відсоткове використання CPU від 1 до 8.
Перший сценарій запустіть Hyper Threading
Перший раз, коли сценарій запускається, номери CPU 2, 4, 6 і 8 (за словами Конкі) заморожуються на 3%, 2%, 2% і 2%. Під час виконання стрес-тесту номери процесора 1, 3, 5 та 7 мають високий рівень на 100%.
Топологія процесора відображається з вимкненою гіпер-різьбою, і повідомляються лише чотири ядра:
/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
Другий сценарій запустіть Hyper Threading
Вдруге запускається сценарій Hyper-Threading увімкнено, і під час виконання стрес-тесту всі номери процесора 1-8 підскокують до 100%.
Топологія процесора відображається з увімкненою гіперрезьбою, і повідомляється лише про чотири ядра плюс та чотири віртуальних ядра:
/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
Третій сценарій запускається Hyper Threading
Зверніть увагу, як після закінчення другого скрипту процесори 2, 4, 6 і 8 на холостому ходу працюють на рівні 4%, 2%, 3%, 4%. Це важливо, оскільки в третьому тесті вимкнення Hyper-Threading показує, що відсотки процесора заморожені на рівні 4%, 2%, 3%, 4%, а не 3%, 2%, 2% та 2% від першого тесту.
Тому вимкнення гіпер-потоків, здається, просто заморожує віртуальний процесор у поточному стані.
Також зауважте, незалежно від того, увімкнено або вимкнено функцію Hyper-Threading, все ще відображається "Hyper Threading Supported".
Bash-скрипт для автоматичного відключення / вмикання гіпер-ниток
Переглядаючи скрипт нижче, майте на увазі, що Conky нумерує процесори від 1 до 8, але Linux чисельність процесорів від 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
ПРИМІТКА . Програма stress
вбудована у всі системи Debian, для яких Ubuntu є похідним. Тому вам не потрібно завантажувати та встановлювати будь-які пакети, щоб запустити цей сценарій в Ubuntu.
Якщо у вас двоядерний процесор, вам потрібно видалити (або прокоментувати #
) рядки, що керують номерами CPU 5 і 7.
Кредит Hi-Angel за базову лінію grep "" /sys/devices/system/cpu/cpu*/topology/core_id
відображення топології процесора.
Conky Crashes, якщо Hyper Threading вимкнено перед його запуском
Щоб отримати процесори 2, 4, 6, 8 до найнижчого можливого відсотка використання, я спробував вимкнути Hyper-Threading під час завантаження. Я використовував цей сценарій для цього:
# 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
Однак відбувається conky
збій із помилкою сегментації, якщо гіпер-нитка вимкнена під час її запуску. Як такий, мені довелося прокоментувати чотири @reboot
рядки в сценарії.
Коньки Conky для відображення відсоткового відсотка використання та коефіцієнта завантаження процесора
Якщо ви зацікавлені в налаштуванні подібного дисплея в Конкі, ось відповідний фрагмент коду:
${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}
ПРИМІТКА. Код Nvidia, описаний вище, ніколи не був протестований, оскільки я ще не працював на графічному процесорі Nvidia під Ubuntu. Будь-який рік зараз :)