У меня есть система, запускающая приложение для финансовой торговли на удаленном объекте. У меня нет доступа к МОТ / DRAC, но мне нужно отключить гиперпоточность. Система работает на шестиъядерных процессорах Intel Westmere 3,33 ГГц X5680. Я могу перезагрузиться, но хочу убедиться, что система не поддерживает гиперпоточность из-за проблем с производительностью. Есть ли чистый способ сделать это изнутри Linux?
Редактировать: noht
директива, добавленная в командную строку загрузки ядра, не работает. То же самое для RHEL.
Смотрите: https://bugzilla.redhat.com/show_bug.cgi?id=440321#c9.
sysbench --num-threads=1 --test=cpu run
с разными num-потоками и включенным и выключенным HT говорит о том, что отключение HT снижает производительность, когда есть много потоков, и даже если есть только один поток, нет смысла отключать HT. Поэтому я предлагаю оставить все как есть: это оптимально.echo 1
вместо того,echo 0
чтобы включить их снова.Скрипт для отключения гиперпоточности при запуске машины ...
Чтобы отключить гиперпоточность, я включаю скрипт на машине /etc/rc.local. Он не совсем чистый, но простой в установке, независимый от архитектуры процессора и должен работать на любом современном дистрибутиве Linux.
Как это работает?
Информация о ядре 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% мощности моего процессора отдается приоритет фоновым задачам.
«Интенсивная загрузка процессора», о которой я говорю, - это интеллектуальный анализ данных и серверы авторизации (моя работа). Блендер рендеринг в дешевых компьютерах и кластерах (для эскиза моего будущего дома).
Кроме того, это догадки.
У меня такое впечатление, что лучше, но может и нет.
источник
Для действительно старых ядер (Linux 2.6.9 или около того) добавьте параметр noht к ядру при загрузке.
Эта опция командной строки ядра была удалена, по крайней мере, с Linux 2.6.18 .
С http://www.faqs.org/docs/Linux-HOWTO/BootPrompt-HOWTO.html :
Если вы используете lilo, отредактируйте ваш файл /etc/lilo.conf (и запустите lilo впоследствии) или, если вы используете grub, отредактируйте ваш файл /boot/grub/menu.lst.
источник
noht
запись в командной строке ядра grub. Система не выполнилаnoht
команду. То же самое для RHEL. См: bugzilla.redhat.com/show_bug.cgi?id=440321#c9noht
ядра была удалена. Это прискорбно, потому что Linux разрешает обход некоторых ошибок счетчика перфектов Haswell (BJ122, BV98, HSD29) только в том случае, если HT включен , и это происходит еще до загрузки initramfs.Вы можете использовать «thread_siblings_list» для каждого ядра, чтобы отключить второе ядро в паре HT.
Следующий командный конвейер является хакерским, не оптимизированным и сделан таким образом, чтобы облегчить понимание.
Итак, возьмите все списки дочерних элементов потока, извлеките второй ЦП для каждой пары, получите уникальный список и затем отключите их.
Имеет ли это смысл?
если я выполнил команду «cat / proc / cpuinfo» после запуска выше, число ядер уменьшается вдвое.
источник
echo 0 > /sys/devices/system/cpu/cpu$X/online
становитсяecho 0 | sudo tee /sys/devices/system/cpu/cpu$X/online
Более новые ядра обеспечивают управление одновременной многопоточностью (SMT).
Вы можете проверить состояние SMT с помощью;
Изменить состояние с помощью
Варианты есть;
Мы проверили это с Linux Kernel 4.4.0
источник
Ответ Лукаса хорош, но на самом деле не работает для отключения HT, потому что идентификатор ядра не может служить для идентификации братьев и сестер HT. Этот скрипт работает вместо:
источник
Мне пришлось ждать, пока я не смогу попасть в МОТ / Драк. Параметры загрузки ядра не работают в текущих дистрибутивах Linux.
источник
В пакете libsmbios-bin (Debian, Ubuntu и т. Д.) У вас есть двоичные файлы isCmosTokenActive и activCmosToken. Вместе со списком токенов вы можете попробовать что-то вроде этого:
Затем активируйте токен CPU_Hyperthreading_Disable:
Убедитесь, что:
Теперь большой вопрос заключается в том, нужна ли вам просто перезагрузка, чтобы это вступило в силу, или требуется полный цикл питания. Попробуйте и посмотрите, как это происходит!
источник
Основываясь на информации, предоставленной Полом М здесь, я бы «написал» это так:
Конечно, он не отключает гиперпоточность в том же смысле, что и при работе с BIOS , в основном он говорит только планировщику задач ядра не использовать некоторые ядра, потому что мы знаем, что они фальшивые.
Программное обеспечение, которое сделало предположение на основе предыдущего состояния
/proc
или/sys
подсистемы, все еще может работать неоптимально или даже не работать из-за этого изменения времени выполнения, поэтому может потребоваться его перезапуск. Например, я заметил,irqbalance
что в таких обстоятельствах был склонен к провалу.источник
Отключить HT:
Включить HT:
Примечание. Это на самом деле не отключает HyperThreading, но отключает «поддельные» ядра, получая почти тот же результат.
источник
tee
, но это все еще не дает реального ответа на вопрос. Эти команды применяются только к определенным аппаратным конфигурациям и могут иметь непреднамеренные последствия для других аппаратных конфигураций. И объяснение того, что делают эти команды, полностью отсутствует.Старая тема, но была причина попробовать этот эксперимент. Во-первых, я вовсе не уверен, что отключение (слегка фальшивых) процессоров во время выполнения действительно эквивалентно отключению Hyperthreading при загрузке. Тем не менее, я увидел небольшое повышение производительности в нашем приложении. (Но недостаточно, чтобы сохранить.)
Использовал значение thread_siblings (общее для многопоточных процессоров) в качестве ключа для включения / выключения:
Попробуйте команду без окончательного sudo sh, чтобы проверить правильность.
источник