Отключите гиперпоточность из Linux (никакой доступ к BIOS)

Нет. Можно использовать обоих.

26
задан 27 July 2016 в 17:15
12 ответов

Я должен был ожидать, пока я не мог войти в ILO/Drac. Параметры начальной загрузки ядра не работают над текущими дистрибутивами Linux.

0
ответ дан 28 November 2019 в 20:07

Для действительно старых ядер (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 впоследствии), или если использование личинки затем редактирует Ваш/boot/grub/menu.lst.

9
ответ дан 28 November 2019 в 20:07

В пакете 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
ответ дан 28 November 2019 в 20:07

Вы можете сделать это во время выполнения, если хотите. Я нашел хорошее решение, описанное здесь: http://www.absolutelytech.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

Вы можете настроить себе сценарий, который вы запускаете сразу после запуска системы.

21
ответ дан 28 November 2019 в 20:07

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

Чтобы отключить гиперпоточность, я включаю скрипт на машине /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 содержит информацию о ядре и элементы управления для логического процессора 3.

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

echo "0"> / sys / devices / system / cpu / cpu3 / online позволяет отключить логический процессор 3.

Почему это работает?

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

Для меня проблема с гиперпоточностью заключается в следующем: если я запускаю столько потоков с интенсивным использованием процессора, сколько у меня есть логических ядер, я будет иметь быстрые переключатели контекста для задач с интенсивным использованием процессора, но дорогие для фоновых задач, поскольку гиперпоточность полностью используется задачами с интенсивным использованием процессора. С другой стороны, если я запущу столько потоков с интенсивным использованием процессора, сколько у меня физических ядер, у меня не будет переключений контекста для этих задач и быстрых переключений контекста для фоновых задач. Вроде бы хорошо, но фоновые задачи найдут свободные логические процессоры и будут запускаться практически мгновенно. Как будто они выступают в реальном времени (хорошо -20).

В первом сценарии гиперпоточность является полезной, фоновые задачи будут использовать дорогостоящие переключатели контекста, потому что я максимизировал гиперпоточность при обычной обработке. Второй вариант неприемлем, потому что до 50% мощности моего процессора отдается приоритетным фоновым задачам.

Задачи, требующие интенсивного использования процессора, - это серверы интеллектуального анализа данных и авторизации (моя работа). Блендерный рендеринг на дешевых компьютерах и кластерах (для наброска моего будущего дома).

Кроме того, это предположения.

У меня сложилось впечатление, что это лучше, но, возможно, это не так.

14
ответ дан 28 November 2019 в 20:07

Вы можете использовать «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" после выполнения вышеуказанного, количество ядер уменьшится вдвое.

9
ответ дан 28 November 2019 в 20:07

ответ Лукаса хорош, но на самом деле не работает для отключения HT, потому что ID ядра не может служить для идентификации 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
4
ответ дан 28 November 2019 в 20:07

Основываясь на информации, предоставленной здесь Полом M , я бы "написал сценарий" следующим образом:

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'

Конечно он не отключает гипер -Threading в том же смысле, что и возня с BIOS , в основном он только сообщает планировщику задач ядра не использовать некоторые ядра, потому что мы знаем, что они фальшивые.

Программное обеспечение, сделавшее свои предположения на основе предыдущего состояния [ Подсистема 1173877] / proc или / sys все еще может работать неоптимально или даже давать сбой из-за этого изменения времени выполнения, поэтому может потребоваться ее перезапуск. Для е. g., я заметил, что irqbalance был склонен к сбою в этих обстоятельствах.

0
ответ дан 28 November 2019 в 20:07

Отключить 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, но отключает «поддельные» ядра, получая почти такой же результат.

0
ответ дан 28 November 2019 в 20:07

Старая тема, но была причина попробовать этот эксперимент. Во-первых, я вовсе не уверен, что отключение (слегка поддельных) процессоров во время выполнения действительно эквивалентно отключению 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 для проверки правильности.

0
ответ дан 28 November 2019 в 20:07

Новые ядра обеспечивают управление одновременной многопоточностью (SMT).

Вы можете проверить состояние SMT с помощью;

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

Изменить состояние с помощью

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

Возможные варианты:

  • on
  • off
  • forceoff

Мы протестировали это с помощью ядра Linux 4.4.0

5
ответ дан 28 November 2019 в 20:07

Отключить SMT/HT во время загрузки с помощью параметра командной строки ядра nosmt :

        nosmt           [KNL,S390] Disable symmetric multithreading (SMT).
                        Equivalent to smt=1.

                        [KNL,x86] Disable symmetric multithreading (SMT).
                        nosmt=force: Force disable SMT, cannot be undone
                                     via the sysfs control file.

Отключить SMT/HT во время выполнения с помощью управления SMT:

   /sys/devices/system/cpu/smt/control:

     This file allows to read out the SMT control state and provides the
     ability to disable or (re)enable SMT. The possible states are:

        ==============  ===================================================
        on              SMT is supported by the CPU and enabled. All
                        logical CPUs can be onlined and offlined without
                        restrictions.

        off             SMT is supported by the CPU and disabled. Only
                        the so called primary SMT threads can be onlined
                        and offlined without restrictions. An attempt to
                        online a non-primary sibling is rejected

        forceoff        Same as 'off' but the state cannot be controlled.
                        Attempts to write to the control file are rejected.

        notsupported    The processor does not support SMT. It's therefore
                        not affected by the SMT implications of L1TF.
                        Attempts to write to the control file are rejected.
        ==============  ===================================================

     The possible states which can be written into this file to control SMT
     state are:

     - on
     - off
     - forceoff

5
ответ дан 12 August 2020 в 22:11

Теги

Похожие вопросы