Я запускаю сервер ubuntu 16.04. Я вижу, что потоковая реклама включена, когда я использую команду lscpu.
Я хочу ее отключить. Я прошел через форумы ubuntu и здесь и здесь.
Это хорошие обсуждения, почему гиперпоточность может быть не очень хорошей. Но нет окончательного решения о том, как отключить его.
Можно ли дать инструкции по отключению гиперпотока? Спасибо.
Для систем, в которых на материнской плате размещаются несколько гнезд процессора, требуется несколько более надежный способ поиска в ядре для пар hyperthread, потому что core_id дублируется. Вот моя версия в системе с двумя 8-ядерными чипами Xeon (пример из 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
Для различных целей вы также можете посмотреть в файлах
/sys/devices/system/cpu/present
/sys/devices/system/cpu/online
/sys/devices/system/cpu/offline
Если вы читали обсуждения, то вы, вероятно, знаете, что обычно нецелесообразно отключать, поэтому я предполагаю, что вы хотите его для учебных целей.
Идея HT состоит в наличии нескольких наборов процессоров регистры для каждого физического ядра (так называемые виртуальные ядра). Нет «лучшего» виртуального ядра, они идентичны.
Сначала вы хотите узнать, какая пара виртуальных ядер принадлежит физическому ядру в файловой системе /sys/. Вы можете использовать файл core_id для этого:
λ 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
Из вывода вы можете сделать вывод, что cpu0 + cpu2 содержатся в одном физическом ядре, а cpu1 + cpu3 - в другом. Теперь добавьте привилегии и используйте команду echo, чтобы отключить ее в каждой паре:
λ sudo -s
# echo 0 > /sys/devices/system/cpu/cpu1/online
# echo 0 > /sys/devices/system/cpu/cpu2/online
Обратите внимание, что cpu0 не имеет «онлайн-файла» и не может быть отключен, поэтому я отключил cpu2 .
Вот сценарий для идентификации ht-ядер и переключения их в онлайн / офлайн.
#!/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, может быть, вы можете добавить это к своему отличному ответу.
Это интересный вопрос. Наверное, один из самых интересных в месяцах для меня лично. Как и OP, нет возможности отключить Hyper Threading в моем старом BIOS (изобретен 2012, обновлено 2016 или около того).
В прошлом году у Skylake появилось множество проблем, о которых сообщалось в Ask Ubuntu, и каждый задается вопросом, как определить, какие проблемы могут быть вызваны ошибками Hyper Threading.
Ниже вы можете увидеть использование ЦП при отключении гиперпотока и провести стресс-тест ЦП. Примерно через 10 секунд повторяется один и тот же сценарий с включенной гиперпотокой. Наконец, через 10 секунд сценарий запускается с гиперпотоком, выключенным снова:
Дисплей разделен на две части:
Дисплей CPU, когда Hyper-Threading выключен / включен В правой половине conky отображается процентное использование CPU с CPUS 1 до 8.При первом запуске скрипта CPU Numbers 2, 4, 6 & amp; 8 (согласно Конки) заморожены на 3%, 2%, 2% и 2%. Число CPU 1, 3, 5 и 7 достигает 100%, пока выполняется стресс-тест.
Топология CPU отображается с отключением гиперпотока и сообщены только четыре ядра:
/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, а все номера CPU 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
Обратите внимание, что после завершения второго скрипта процессоры 2, 4, 6 и 8 работают на холостом ходу на 4%, 2%, 3%, 4%. Это важно, потому что в третьем тестовом режиме выключение Hyper-Threading показывает, что проценты CPU замерзают на 4%, 2%, 3%, 4%, а не 3%, 2%, 2% и 2% от первого теста.
Поэтому выключение гиперпоточности, по-видимому, просто затормозит виртуальные процессоры в текущем состоянии.
Также обратите внимание, независимо от того, включен или выключен Hyper-Threading. Скрипт все еще отображает «Hyper Threading Поддерживается ".
При просмотре сценария ниже помните, что 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:
# https://askubuntu.com/questions/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.
Подтвердить для строки bash grep "" /sys/devices/system/cpu/cpu*/topology/core_id, отображающей топологию ЦП.
Чтобы получить CPU 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:
# https://askubuntu.com/questions/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 , Любой год скоро:)
Для систем, в которых на материнской плате размещаются несколько гнезд процессора, требуется несколько более надежный способ поиска в ядре для пар hyperthread, потому что core_id дублируется. Вот моя версия в системе с двумя 8-ядерными чипами Xeon (пример из 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
Для различных целей вы также можете посмотреть в файлах
/sys/devices/system/cpu/present
/sys/devices/system/cpu/online
/sys/devices/system/cpu/offline
Если вы читали обсуждения, то вы, вероятно, знаете, что обычно нецелесообразно отключать, поэтому я предполагаю, что вы хотите его для учебных целей.
Идея HT состоит в наличии нескольких наборов процессоров регистры для каждого физического ядра (так называемые виртуальные ядра). Нет «лучшего» виртуального ядра, они идентичны.
Сначала вы хотите узнать, какая пара виртуальных ядер принадлежит физическому ядру в файловой системе /sys/. Вы можете использовать файл core_id для этого:
λ 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
Из вывода вы можете сделать вывод, что cpu0 + cpu2 содержатся в одном физическом ядре, а cpu1 + cpu3 - в другом. Теперь добавьте привилегии и используйте команду echo, чтобы отключить ее в каждой паре:
λ sudo -s
# echo 0 > /sys/devices/system/cpu/cpu1/online
# echo 0 > /sys/devices/system/cpu/cpu2/online
Обратите внимание, что cpu0 не имеет «онлайн-файла» и не может быть отключен, поэтому я отключил cpu2 .
Вот сценарий для идентификации ht-ядер и переключения их в онлайн / офлайн.
#!/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, может быть, вы можете добавить это к своему отличному ответу.
Это интересный вопрос. Наверное, один из самых интересных в месяцах для меня лично. Как и OP, нет возможности отключить Hyper Threading в моем старом BIOS (изобретен 2012, обновлено 2016 или около того).
В прошлом году у Skylake появилось множество проблем, о которых сообщалось в Ask Ubuntu, и каждый задается вопросом, как определить, какие проблемы могут быть вызваны ошибками Hyper Threading.
Ниже вы можете увидеть использование ЦП при отключении гиперпотока и провести стресс-тест ЦП. Примерно через 10 секунд повторяется один и тот же сценарий с включенной гиперпотокой. Наконец, через 10 секунд сценарий запускается с гиперпотоком, выключенным снова:
Дисплей разделен на две части:
Дисплей CPU, когда Hyper-Threading выключен / включен В правой половине conky отображается процентное использование CPU с CPUS 1 до 8.При первом запуске скрипта CPU Numbers 2, 4, 6 & amp; 8 (согласно Конки) заморожены на 3%, 2%, 2% и 2%. Число CPU 1, 3, 5 и 7 достигает 100%, пока выполняется стресс-тест.
Топология CPU отображается с отключением гиперпотока и сообщены только четыре ядра:
/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, а все номера CPU 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
Обратите внимание, что после завершения второго скрипта процессоры 2, 4, 6 и 8 работают на холостом ходу на 4%, 2%, 3%, 4%. Это важно, потому что в третьем тестовом режиме выключение Hyper-Threading показывает, что проценты CPU замерзают на 4%, 2%, 3%, 4%, а не 3%, 2%, 2% и 2% от первого теста.
Поэтому выключение гиперпоточности, по-видимому, просто затормозит виртуальные процессоры в текущем состоянии.
Также обратите внимание, независимо от того, включен или выключен Hyper-Threading. Скрипт все еще отображает «Hyper Threading Поддерживается ".
При просмотре сценария ниже помните, что 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:
# https://askubuntu.com/questions/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.
Подтвердить для строки bash grep "" /sys/devices/system/cpu/cpu*/topology/core_id, отображающей топологию ЦП.
Чтобы получить CPU 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:
# https://askubuntu.com/questions/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 , Любой год скоро:)