Назад | Перейти на главную страницу

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

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

Изменить: noht директива, добавленная в командную строку загрузки ядра, не работала. То же самое для RHEL.

Видеть: https://bugzilla.redhat.com/show_bug.cgi?id=440321#c9

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

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

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

Чтобы отключить гиперпоточность, я включаю сценарий на машине /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. Например:

/ система / устройства / система / ЦП / ЦП3 содержит информацию о ядре и элементы управления для логического процессора 3.

кошка / система / устройства / система / ЦП / ЦП3 / топология / core_id покажет номер ядра, которому принадлежит этот логический процессор.

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

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

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

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

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

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

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

Мне кажется, что лучше, но может и нет.

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

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

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

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

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

Варианты:

  • на
  • выключен
  • принудительное отключение

Мы протестировали это с Linux Kernel 4.4.0.

Для действительно старых ядер (Linux 2.6.9 или около того) добавьте нет параметр ядра при загрузке.

Этот параметр командной строки ядра был удален как минимум с 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.

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

Ответ Лукаса хорош, но на самом деле он не работает для отключения 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

Отключить 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

Пришлось ждать, пока я попаду в МОТ / Драк. Параметры загрузки ядра не работают в текущих дистрибутивах Linux.

В пакете 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

Теперь большой вопрос заключается в том, нужна ли вам просто перезагрузка, чтобы это вступило в силу, или требуется полный цикл питания. Попробуйте и посмотрите, как получится!

На основе информация предоставлена ​​Paul 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'

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

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

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

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

Попробуйте команду без финала судо ш чтобы проверить правильность.