Я выполняю сервер человечности 16.04. Я вижу, что поточная обработка шумихи включена, когда я использую команду lscpu.
Я хочу отключить его. Я прошел форумы человечности и здесь и здесь.
Это хорошие обсуждения, почему поточная обработка hyper может, может - не быть хорошим. Но никакое категорическое решение о том, как выключить его.
Кто-либо может дать шаги для отключения гиперпоточности? Спасибо.
Если Вы считали обсуждения, то Вы, вероятно, знаете, что обычно неблагоразумно отключить, таким образом, я предположу, что Вы хотите это для изучения целей.
Идея 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 вместо этого.
Это - интересный вопрос. Вероятно, один из самых интересных в течение многих месяцев для меня лично. Как OP нет никакой опции для отключения Hyper, Распараллеливающего в моем старом BIOS (изобретенный 2012, обновленный приблизительно 2016).
Любой использующий процессоры Intel Skylake или Kaby Lake должен прочитать отчеты об ошибках о Поточной обработке Hyper, которая появилась пара несколько месяцев назад. Эта британская история Регистра обстоятельно объясняет, как Разработчики Debian определили, как Поточная обработка Hyper может разрушить и повредить машину.
Существуют многочисленные проблемы с Skylake, о котором сообщают в, Спрашивает Ubuntu за прошлый год, и каждый задается вопросом, как различить, какие проблемы, возможно, были вызваны Ошибками многопоточного выполнения Hyper.
Ниже Вас видят загрузку ЦП, когда гиперпоточность выключена, и стресс-тест ЦП выполняется. Приблизительно 10 секунд спустя тот же сценарий повторяется с включенной поточной обработкой hyper. Наконец 10 секунд после этого сценарий выполняются с гиперпоточностью, выключенной снова:
Дисплей разделен на два раздела:
set-hyper-threading
с параметром 0 (прочь) и затем 1 (на).conky
отображает использование процента использования ЦП CPU 1 - 8.В первый раз сценарием является выполненный ЦП Номера 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
Во второй раз сценарием является выполненная Гиперпоточность, включен и весь скачок ЦП Номер 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%. Это важно потому что в третьей тестовой Гиперпоточности превращения от шоу те проценты использования ЦП, замороженные в 4%, 2%, 3%, 4%, а не 3%, 2%, 2% и 2% от первого теста.
Поэтому выключение гиперпоточности, кажется, просто замораживает виртуальные центральные процессоры в текущем состоянии.
Также отметьте, неважно, если Вы включаете Гиперпоточность, или от сценария все еще отображает "Поддерживаемую Поточную обработку Hyper".
Когда просмотр сценария ниже имеет в виду, что Носатые числа центральные процессоры от 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.
Кредит Привет-ангелу для строки удара grep "" /sys/devices/system/cpu/cpu*/topology/core_id
отображение топологии ЦП.
Для получения центральных процессоров 2, 4, 6, 8 к самому низкому использованию процента, возможному, я пытался выключить Гиперпоточность во время, загружаются. Я использовал этот сценарий, чтобы сделать это:
# 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
строки в сценарии.
Если Вы интересуетесь установкой подобного дисплея в Носатом, вот отрывок соответствующих норм:
${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 выше никогда не тестировался, потому что у меня нет GPU Nvidia еще, работающего в соответствии с Ubuntu. Любой год скоро теперь :)
Немного больше устойчивого способа посмотреть в ядре для пар гиперпотока необходимо для систем, где материнская плата размещает несколько сокетов ЦП, потому что core_id дублирован. Вот моя версия в системе с двумя микросхемами Xeon с 8 ядрами (пример из 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-ядра и переключить их онлайн/офлайн.
#!/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, возможно, можно добавить это к превосходному ответу.
Ответ @visit1985 не работает, если разделитель в thread_siblings_list не является запятой (который является, например, случаем в моей системе Ryzen AMD).
Вот сценарий для превращения гиперпоточности от этого работы с любым разделителем:
#!/bin/bash
for cpu in /sys/devices/system/cpu/cpu[1-9]*; do
if [ -e "$cpu/topology/thread_siblings_list" ]; then
sibling=$(awk -F '[^0-9]' '{ print $2 }' $cpu/topology/thread_siblings_list)
if [ ! -z $sibling ]; then
echo 0 > "/sys/devices/system/cpu/cpu$sibling/online"
fi
fi
done
И вот для включения гиперпоточности:
#!/bin/bash
for cpu in /sys/devices/system/cpu/cpu[1-9]*; do
echo 1 > "$cpu/online"
done
Недавние ядра поддерживают maxcpus параметр ядра.
Это позволяет Вам определять номер CPU к количеству физических ядер. Это может быть полезно, чтобы помочь смягчить угрозы, вызванные уязвимостями MDS на Intel CPUs от семейства 6.
Как:
с sudo (корень) дают полномочия, открывают/etc/default/grub с Вашим любимым текстовым редактором.
Найдите строку, которая начинается с GRUB_CMDLINE_LINUX_DEFAULT =
и добавьте maxcpus=n к любым существующим параметрам ядра, таким как общие тихие параметры всплеска (где n = количество физических ядер Ваш CPU имеет.
Например, на моем испытанном Intel(R) Core(TM) i3-3220 CPU 3.30 ГГц, двухъядерные с гиперпоточностью, я добавил maxcpus=2 для выключения гиперпоточности во время начальной загрузки.
Сохраните файл и затем дайте команду sudo update-grub
и перезагрузка.
Можно подтвердить успех путем выдачи команды lscpu | grep "per core"
который должен обеспечить вывод как это:
Thread(s) per core: 1
Протестированный на ядре 4.4.0
Источники:
https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/kernel-parameters.txt
https://www.kernel.org/doc/html/latest/admin-guide/hw-vuln/mds.html
https://unix.stackexchange.com/questions/145645/disabling-cpu-cores-on-quad-core-processor-on-linux
maxcpus=n
параметр в GRUB_CMDLINE_LINUX_DEFAULT=
не работает правильно. Это оставило меня с 2 ядрами и 4 потоками вместо 4 ядер 4 потоками.
Я нашел решение.
Добавить mitigations=auto,nosmt
кому: GRUB_CMDLINE_LINUX_DEFAULT=
вместо этого
Протестированный на Ubuntu 16.04 LTS с Linux 4.4.0.
Источник: https://wiki.ubuntu.com/SecurityTeam/KnowledgeBase/MDS
Можно отключить гиперпоточность в Linux как корень или с полномочиями суперпользователя с:
# echo off > /sys/devices/system/cpu/smt/control
Можно отобразить текущее состояние гиперпоточности с:
$ cat /sys/devices/system/cpu/smt/control
Эта команда печатает один из:
on|off|forceoff|notsupported|notimplemented
С другой стороны, большинство встроенных микропрограммных обеспечений BIOS также включает опцию для отключения гиперпоточности. Если это отключено в BIOS, вышеупомянутая кошка, вероятно, возвращается forceoff
.