Для действительно старых ядер (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.
В пакете 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
Теперь большой вопрос заключается в том, нужен ли вам просто перезагрузите компьютер, чтобы это вступило в силу, или если требуется полный цикл питания. Попробуйте и посмотрите, что получится!
Вы можете сделать это во время выполнения, если хотите. Я нашел хорошее решение, описанное здесь: 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. Например:
/ 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% мощности моего процессора отдается приоритетным фоновым задачам.
Задачи, требующие интенсивного использования процессора, - это серверы интеллектуального анализа данных и авторизации (моя работа). Блендерный рендеринг на дешевых компьютерах и кластерах (для наброска моего будущего дома).
Кроме того, это предположения.
У меня сложилось впечатление, что это лучше, но, возможно, это не так.
Вы можете использовать «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, потому что 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
Основываясь на информации, предоставленной здесь Полом 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
был склонен к сбою в этих обстоятельствах.
Отключить 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
Попробуйте выполнить команду без финального sudo sh для проверки правильности.
Новые ядра обеспечивают управление одновременной многопоточностью (SMT).
Вы можете проверить состояние SMT с помощью;
cat /sys/devices/system/cpu/smt/active
Изменить состояние с помощью
echo off > /sys/devices/system/cpu/smt/control
Возможные варианты:
Мы протестировали это с помощью ядра Linux 4.4.0
Отключить 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