Вимкнути гіпертодування з Linux (немає доступу до BIOS)


26

У мене є система, яка запускає додаток для фінансової торгівлі на віддаленому центрі. У мене немає доступу до ILO / DRAC, але мені потрібно вимкнути гіперточування. Система працює з шестнадцятковими процесорними процесорами Intel Westmere 3,33 ГГц X5680. Я можу перезавантажитись, але хочу переконатися, що система не вмикає гіперточування через проблеми з продуктивністю. Чи є чистий спосіб це зробити з Linux?

Редагувати: nohtДиректива, додана до командного рядка завантаження ядра, не працювала. Те саме для RHEL.

Дивіться: https://bugzilla.redhat.com/show_bug.cgi?id=440321#c9

Відповіді:


21

Ви можете це зробити під час виконання, якщо хочете. Я знайшов приємне рішення, описане тут: http://www.absgethertech.com/2011/08/01/how-to-disable-cpu-cores-in-linux/

Крок 1. Визначте процесори Linux, які потрібно вимкнути:

cat /proc/cpuinfo

Шукайте процесори, які мають однаковий "основний ідентифікатор", ви хочете вимкнути одну з кожної пари.

Крок 2: Вимкніть процесори з гіперпотоком (у моєму випадку останні чотири із загальних 8 "процесорів", які бачив Linux)

echo 0 > /sys/devices/system/cpu/cpu4/online
echo 0 > /sys/devices/system/cpu/cpu5/online
echo 0 > /sys/devices/system/cpu/cpu6/online
echo 0 > /sys/devices/system/cpu/cpu7/online

Ви можете налаштувати сценарій, який ви запускаєте відразу після запуску системи.


1
Це працює майже так, як я очікував. віртуальні ядра відключені, тепер, коли я виконую один процесор, що споживає процесор, він завантажує фізичне ядро ​​на 100%. Але використання sysbench --num-threads=1 --test=cpu runрізних num-потоків і включення та вимкнення HT говорить про те, що вимкнення HT знижує ефективність, коли багато потоків, і навіть якщо є лише один потік, від вимкнення HT немає користі. Тому я пропоную залишити його таким, яким він є: це оптимально.
Сергій П. ака лазурний

Чи знаєте ви, що таке команда повернути їх назад? Посилання на початку вашої відповіді мертве ~. Спасибі!
користувач189035

@ user189035: echo 1замість echo 0слід увімкнути їх.
Пітер Кордес

@ SergeyP.akaazure, я думаю, що для програми фінансових послуг головна причина відключення HT - це не продуктивність, а безпека.
Саймон Ріхтер

@SimonRichter У той час, коли це питання було спочатку написано, воно справді було результативним. SMT / HT не були настільки ж хорошими в деяких робочих навантаженнях на процесори тієї епохи. Річ «Зрив / Привид» та новітні напади «Передчуття» сталися через роки.
Майкл Хемптон

14

Сценарій для відключення гіперточення при запуску машини ...

Для відключення гіперточення я включаю скрипт на machine /etc/rc.local. Він не є чітким, але простий в установці, незалежно від архітектури процесора і повинен працювати над будь-яким сучасним дистрибутивом Linux.

nano /etc/rc.local

    # place this near the end before the "exit 0"

    for CPU in /sys/devices/system/cpu/cpu[0-9]*; do
        CPUID=$(basename $CPU)
        echo "CPU: $CPUID";
        if test -e $CPU/online; then
                echo "1" > $CPU/online; 
        fi;
        COREID="$(cat $CPU/topology/core_id)";
        eval "COREENABLE=\"\${core${COREID}enable}\"";
        if ${COREENABLE:-true}; then        
                echo "${CPU} core=${CORE} -> enable"
                eval "core${COREID}enable='false'";
        else
                echo "$CPU core=${CORE} -> disable"; 
                echo "0" > "$CPU/online"; 
        fi; 
    done;    

Як це працює?

До інформації та керуючих ядер Linux можна отримати доступ до файлів у каталозі / sys на сучасних дистрибутивах Linux. Наприклад:

/ sys / devices / system / cpu / cpu3 містить інформацію про ядро ​​та елементи керування для логічного cpu 3.

cat / sys / devices / system / cpu / cpu3 / topology / core_id покаже основний номер, до якого належить логічний процесор

echo "0"> / sys / devices / system / cpu / cpu3 / online дозволяє відключити логічний cpu 3.

Чому це працює?

Я точно не знаю, чому ... але система стає більш чутливою до відключення гіперточення (на моєму i5-ноутбуці та масивних серверах Xeon з 60+ ядрами). Я думаю, що це стосується кеш-пам’ят per-cpu, розподілу пам’яті per-cpu, розподілу планувальників cpu та складних ітерацій пріоритетів процесу. Я думаю, що переваги гіпертрейдингу переважають через складність створення планувальників процесорів, які вміють ним користуватися.

Для мене проблема з гіпертодією полягає в тому, що: якщо я запускаю стільки процесорів, що інтенсивно працюють настільки, наскільки у мене є логічні ядра, у мене будуть швидкі контекстні комутатори для завдань, що інтенсивно працюють на процесорі, але дорогі для фонових завдань, оскільки гипертрейдинг повністю споживається CPU інтенсивні завдання. З іншого боку, якщо я запускаю стільки процесорно-інтенсивних потоків, скільки у мене є фізичні ядра, у мене не буде контекстних переключень на ці завдання та швидких контекстних комутаторів для фонових завдань. Здається, добре, але фонові завдання знайдуть безкоштовні логічні процесори і працюватимуть майже негайно. Це так, як вони в режимі реального часу (добре -20).

У першому сценарії гіперточення - це uselles, фонові завдання використовуватимуть дорогі контекстні комутатори, тому що я викреслював гіперпереборку при звичайній обробці. Другий неприйнятний, оскільки до 50% моєї процесорної потужності надає пріоритет фоновим завданням.

Завдання, про які я говорю, - це сервер інтелектуального інтелекту та сервери авторизації (моя робота). Візуалізація блендерів у дешевих комп’ютерах та кластерах (для замальовки мого майбутнього будинку).

Також це здогадки.

У мене таке враження, що краще, але може і не так.


Я думаю, що мій сценарій трохи легше дотримуватися.
Пол М

9

Для дійсно старих ядер (Linux 2.6.9 або більше) додайте параметр noht до ядра під час завантаження.

Цю опцію командного рядка ядра було видалено щонайменше з Linux 2.6.18 .


Від http://www.faqs.org/docs/Linux-HOWTO/BootPrompt-HOWTO.html :

The `noht' Argument

This will disable hyper-threading on intel processors that have this feature. 

Якщо ви використовуєте lilo, відредагуйте /etc/lilo.conf (та запустіть lilo після цього) або якщо ви використовуєте grub, то відредагуйте /boot/grub/menu.lst.


Це функціонально еквівалентно відключенню HT у BIOS?
ewwhite

Я точно цього не знаю, але так, я б очікував, що noht буде еквівалентним відключення його в BIOS.
rems

2
Це система Gentoo. Я спробував nohtзапис у командному рядку ядра grub. Система не шанувала nohtкоманду. Те саме для RHEL. Дивіться: bugzilla.redhat.com/show_bug.cgi?id=440321#c9
ewwhite

1
Це застаріло, оскільки принаймні Linux 2.6.18 . Варіант nohtядра було видалено. Це прикро, тому що Linux дозволяє вирішувати деякі помилкові помилки Haswell (BJ122, BV98, HSD29), лише якщо HT увімкнено , і це відбувається до того, як initramfs навіть завантажується.
Пітер Кордес

9

Ви можете використовувати "thread_siblings_list" для кожного ядра, щоб вимкнути друге ядро ​​в HT-парі.

Наступний конвеєр команд хакі, не оптимізований і зроблений таким чином, сподіваючись, щоб було легше зрозуміти.

cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | \
awk -F, '{print $2}' | \
sort -n | \
uniq | \
( while read X ; do echo $X ; echo 0 > /sys/devices/system/cpu/cpu$X/online ; done )

отже, візьміть усі списки побратимів, витягніть другий процесор для кожної пари, отримайте унікальний список, а потім вимкніть їх.

це має сенс?

якщо я виконую "cat / proc / cpuinfo" після запуску вище, кількість ядер вдвічі.


Це чудова відповідь. Мені довелося модифікувати це так, щоб працювати для моїх цілей: echo 0 > /sys/devices/system/cpu/cpu$X/onlineстаєecho 0 | sudo tee /sys/devices/system/cpu/cpu$X/online
карбокація

5

Новіші ядра забезпечують одночасне багатопотокове управління (SMT).

Ви можете перевірити стан SMT за допомогою;

cat /sys/devices/system/cpu/smt/active

Змініть стан на

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

Варіанти є;

  • на
  • вимкнено
  • відключення

Ми перевірили це за допомогою Linux Kernel 4.4.0


Привіт Нік і ласкаво просимо на сайт. Інформація про тести (та версії) є досить цінною.
kubanczyk

Відмінно, випробувано на Ubuntu 16.04.6 LTS
Elder Geek

4

Відповідь Лукаса хороша, але насправді не вимикає HT, оскільки основний ідентифікатор не може слугувати для ідентифікації HT-побратимів. Цей сценарій працює замість цього:

#!/bin/bash
for CPU in /sys/devices/system/cpu/cpu[0-9]*; do
    CPUID=`basename $CPU | cut -b4-`
    echo -en "CPU: $CPUID\t"
    [ -e $CPU/online ] && echo "1" > $CPU/online
    THREAD1=`cat $CPU/topology/thread_siblings_list | cut -f1 -d,`
    if [ $CPUID = $THREAD1 ]; then
        echo "-> enable"
        [ -e $CPU/online ] && echo "1" > $CPU/online
    else
        echo "-> disable"
        echo "0" > $CPU/online
    fi
done

твій сценарій - мій варіант. нам доведеться перевірити, що станеться, якщо у вас є кілька процесорів, просто щоб бути впевненим.
Пол М

@PaulM Саме тут я протестував і використав це для своїх цілей: 2 розетки Haswell.
Антон

0

Мені довелося чекати, поки я зміг потрапити в ILO / Drac. Параметри завантаження ядра не працюють у поточних дистрибутивах Linux.


0

У пакеті libsmbios-bin (Debian, Ubuntu тощо) у вас є бінарні файли isCmosTokenActive та activateCmosToken. Разом зі списком лексем ви можете спробувати щось подібне:

# isCmosTokenActive 0x00d1 # CPU_Hyperthreading_Enable
[...] Type 0x00d1  Location 0x46 AND(fe) OR(0)  BITFIELD: 1
# isCmosTokenActive 0x00d2 # CPU_Hyperthreading_Disable
[....] Type 0x00d2  Location 0x46 AND(fe) OR(1)  BITFIELD: 0

Потім активуйте маркер CPU_Hyperthreading_Disable:

# activateCmosToken 0x00d2 # CPU_Hyperthreading_Disable
[...] Type 0x00d2  Location 0x46 AND(fe) OR(1)  BITFIELD: 1

Перевірте:

# isCmosTokenActive 0x00d1 # CPU_Hyperthreading_Enable
[...] Type 0x00d1  Location 0x46 AND(fe) OR(0)  BITFIELD: 0
# isCmosTokenActive 0x00d2 # CPU_Hyperthreading_Disable
[...] Type 0x00d2  Location 0x46 AND(fe) OR(1)  BITFIELD: 1

Тепер велике питання полягає в тому, чи потрібно вам просто перезавантажити, щоб це вступило в силу, чи потрібен повний цикл живлення. Спробуйте це і подивіться, як це відбувається!


0

На основі інформації, наданої тут Полом М , я б "скриптував" це так:

fgrep , /sys/devices/system/cpu/cpu*/topology/thread_siblings_list |
cut -d, -f2 | sort -u |
sudo xargs -rI, sh -c 'echo 0 > /sys/devices/system/cpu/cpu,/online'

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

Програмне забезпечення, яке зробило припущення на основі попереднього стану /procабо /sysпідсистеми, все ще може працювати недооптимальним або навіть вийти з ладу через цю зміну часу виконання, тому може знадобитися його перезапуск. Наприклад, я помітив, irqbalanceщо за таких обставин був схильний до збою.


0

Вимкнути HT:

echo 0 |sudo tee /sys/devices/system/cpu/cpu{4..7}/online

Увімкнути HT:

echo 1 |sudo tee /sys/devices/system/cpu/cpu{4..7}/online

Примітка: це насправді не вимикає HyperThreading, але вони вимикають "підроблені" ядра, отримуючи майже той самий результат.


Мені подобається, як ви користуєтесь tee, але це все ще не відповідає реальній відповіді на питання. Ці команди застосовуються лише до певних конфігурацій апаратних засобів і можуть мати ненавмисний вплив на інші апаратні конфігурації. І пояснення того, що роблять ці команди, повністю відсутнє.
kasperd

Оскільки 0 означає вимикання, а 1 означає включення, я подумав, що це легко зрозуміти, що перше вимикає 4 ядра (з підроблених 8 на quandocore із включеним гіперточенням), а друге вмикає їх знову ... Якщо у вас є ДВОЙНА ядро цих цифр повинно бути {3,4} замість {4..7} Якщо ви використовуєте восьмикорову, це має бути {8..15}
Zibri

0

Стара тема, але була причина спробувати цей експеримент. По-перше, я зовсім не впевнений, що відключення (злегка підроблених) процесорів під час виконання справді еквівалентно відключенню Hyperthreading під час завантаження. Однак, у нашому додатку я побачив невелике підвищення продуктивності. (Але недостатньо, щоб зберегти.)

Використовували значення thread_siblings (загальне для гіперточених процесорів) як ключ для включення / відключення:

for i in /sys/devices/system/cpu/cpu[0-9]* 
do echo "$(cat $i/topology/thread_siblings) $i" 
done | 
awk '{v = (a[$1] ? 0 : 1); a[$1] = 1; print "echo " v " > " $2 "/online"}' | 
sudo sh 

Спробуйте команду без остаточного sudo sh, щоб перевірити правильність.

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