Вступление
Это интересный вопрос. Наверное, один из самых интересных за месяцы лично для меня. Как и OP, в моем старом BIOS нет опции отключения Hyper Threading (изобретена в 2012 году, обновлена в 2016 году или около того).
Ошибки Hyper-Threading в Intel Skylake и Kaby Lake:
Любой, кто использует процессоры Intel Skylake или Kaby Lake , должен прочитать отчеты об ошибках в Hyper Threading, которые появились пару месяцев назад. В этой истории о регистрации в Великобритании рассказывается, как разработчики Debian обнаружили, как Hyper Threading может привести к сбою и повреждению компьютера.
За последний год в Ask Ubuntu сообщалось о многочисленных проблемах со Skylake, и возникает вопрос, как определить, какие проблемы могли быть вызваны ошибками Hyper Threading.
Этот ответ делится на три части:
- Отображение процессоров, когда Hyper-Threading выключен / включен
- Скрипт Bash для автоматизации включения / выключения гиперпоточности
- Conky Сбои, если Hyper Threading отключена до его запуска
Отображение процессоров, когда Hyper-Threading выключен / включен
Ниже вы можете увидеть загрузку ЦП, когда гиперпоточность отключена и выполняется нагрузочный тест ЦП. Примерно через 10 секунд тот же сценарий повторяется с включенной гиперпоточностью. Наконец, через 10 секунд скрипт запускается с отключенной гиперпоточностью:
Дисплей разделен на две части:
- В левой половине окна терминала вызывается скрипт
set-hyper-threading
с параметром 0 (выкл) и затем 1 ( вкл ).
- В правой половине
conky
отображается загрузка ЦП в процентах от 1 до 8.
Первый скрипт запускает Hyper Threading
При первом запуске скрипта номера ЦП 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.
Если у вас двухъядерный процессор, вам нужно удалить (или закомментировать #
) строки, управляющие процессорами с номерами 5 и 7.
Благодарим Hi-Angel за grep "" /sys/devices/system/cpu/cpu*/topology/core_id
отображение строки топологии процессора.
Conky Сбои, если 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 Code для отображения процента использования процессора и коэффициента загрузки
Если вы заинтересованы в настройке подобного дисплея в 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. Любой год скоро сейчас :)