Вимкнути гіпер-потоки в Ubuntu


15

Я запускаю сервер ubuntu 16.04. Я можу бачити, що введення потоку hype увімкнено, коли я використовую команду lscpu.

Я хочу відключити це. Я пройшов форуми ubuntu і тут, і тут .

Це хороші дискусії, чому гіпер-нарізка може не бути хорошою. Але немає остаточного рішення, як його вимкнути.

Чи може хтось дати кроки для відключення гіперточення? Спасибі .


3
Ви намагалися відключити його в BIOS?
edwinksl

так, не вдалося знайти варіант для HT
John

Відповіді:


9

Вступ

Це цікаве питання. Напевно, один із найцікавіших за кілька місяців для мене особисто. Як і у 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 секунд після цього сценарій запускається з гіпер-потоком, вимкненим знову:

Встановіть Hyper Threading noht

Дисплей розділений на два розділи:

  • У лівій половині вікна терміналу викликається сценарій 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. Будь-який рік зараз :)


1
Вибачте, але nohtне існує. Я навіть привітався за цю опцію через джерела linux-4.13-rc1, які мені трапляються іноді. Однак я, безумовно, розумію, що могло вас збентежити: dat bugreport скаржиться, що параметр не працює, а потім він закривається так nextrelease, ніби вони щось виправили. Однак якщо ви прочитаєте коментарі, ви побачите, що використання використовується лише nohtдля розробленого вручну сценарію, який перевіряє командний рядок ядра на параметр, а потім вимикає ядра через /sys/файлову систему. IOW nohtмарний.
Привіт-Ангел

@ Привіт-Ангел Спасибі за вказівку, що це не обов’язково. Я зробив тестування без цього, і автономні ядра подвоїлися з 2,2,5,5% (з ноттом) до 5,5,10,10% (без noht). Я зробимо більше тестування сьогодні ввечері. Я шукав документацію параметрів ядра і не можу знайти жодної посилання на noht.
WinEunuuchs2Unix

Зі сторони, немає машини / людської мови для індексації :) Щоб вирішити плутанину з індексами, починаючи з 0, 1 або навіть певного числа (як це є у MiniZinc) , краще подумати з точки зору наборів індексів , тобто викид від набору індексів до іншого набору. Абстрагування його дозволяє легше відзначати, коли деякі релевантні для даних дані, які не представляють індекси, насправді можуть бути використані для індексації після отримання трохи закрученого. Перевага полягає в тому, щоб мати на увазі концепцію, не пов'язану з компонуванням пам'яті та іншими обмеженнями.
Привіт-Ангел

@ Hi-Angel Подібне порівняння між "Стартовою позицією" та "Зсувом", мабуть. У будь-якому випадку я збираюся переписати цю відповідь на основі останніх двох днів тестування та кодування, щоб наші коментарі незабаром застаріли ...
WinEunuuchs2Unix

6

Останні ядра підтримують параметр ядра maxcpus .

Це дозволяє встановити кількість cpus до кількості фізичних ядер. Це може бути корисним для зменшення загроз, спричинених вразливістю MDS на процесорах Intel з сім'ї 6.

Як:

з відкритими привілеями sudo (root) / etc / default / grub з улюбленим текстовим редактором.

Знайдіть рядок, який починається з GRUB_CMDLINE_LINUX_DEFAULT =

і додайте maxcpus = n до будь-яких існуючих параметрів ядра, таких як загальні параметри тихого сплеску (де n = кількість фізичних ядер, які має ваш процесор).

Наприклад, на моєму надійному процесорі Intel (R) Core (TM) i3-3220 процесора @ 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

/unix/145645/disabling-cpu-cores-on-quad-core-processor-on-linux


1
Цікаві посилання. Дякую, що поділились.
WinEunuuchs2Unix

@ WinEunuuchs2Unix Моє задоволення. Завжди прагну допомогти!
Старійшина

5

Ви можете вимкнути гіпертодування в Linux як root або з привілеями суперпользователя за допомогою:

# echo off > /sys/devices/system/cpu/smt/control

Ви можете відобразити поточний стан гіперточення за допомогою:

$ cat /sys/devices/system/cpu/smt/control

Ця команда друкує один із:

on|off|forceoff|notsupported|notimplemented

Крім того, більшість прошивок BIOS також включає можливість відключення гіперточення. Якщо він відключений у BIOS, вищезгадана кішка, ймовірно, повернеться forceoff.


Ви пробували це, щоб відключити гіперзарядку під час завантаження?
Старійшина Гейк

1
@ElderGeek ні, я не пробував maxcpus=параметр ядра для відключення гіперточення. Головним чином, тому, що я не можу знайти жодної офіційної документації про її взаємодію з ядрами гіперточення. Чи гарантовано завжди вимкнути гіпертодування, якщо вказати maxcpus=#real_cores? Або, можливо, у вас є половина реальних ядер, коли HT все ще ввімкнено в деяких системах? Крім того, одна maxcpus=установка не переноситься між машинами з різною кількістю ядер. Збереження варіантів цього параметра для різних машин було б втомливим та схильним до помилок.
maxschlepzig

На мій досвід, завжди вимкнено гіпертодування, якщо ви вказуєте maxcpus = # real_cores, звичайно, якщо ви довіряєте виводу lscpu | grep "per core"Ви робите валідну точку щодо переносимості, однак на зворотному боці встановлення параметра ядра не здається занадто обтяжливою завданням до мене.
Старійшина

2

Ось сценарій для виявлення 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 , можливо, ви можете додати це до відмінної відповіді.


Я повинен був чисельно сортувати список , щоб змусити його працювати правильно:for i in $(find /sys/devices/system/cpu/cpu[0-9]* -maxdepth 0 -type d |sort -V); do
Neuhaus

2

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


1

Трохи більш надійний спосіб пошуку ядра для гіпертокових пар потрібен системам, де на материнській платі розміщено декілька сокетів процесора, оскільки дублікат 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

0

Якщо ви читали дискусії, то, напевно, знаєте, що зазвичай це нерозумно відключати, тому я припускаю, що ви хочете цього в навчальних цілях.

Ідея 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.


0

@ visit1985 відповідь не працює, якщо роздільник у thread_siblings_list не є комою (що, наприклад, у моїй системі AMD Ryzen).

Ось сценарій для вимкнення гіперпотоку, який працює з будь-яким роздільником:

#!/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

Чи працює цей метод на вашому процесорі Ryzen?
Старійшина Гейк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.