Linux отключить hyper threading

Обновлено: 06.07.2024

Как проверить, включена ли гиперпоточность на машине Linux, используя скрипт perl для проверки?

Я пытаюсь сделать следующий путь:

Сообщите мне, если я на правильном пути.

Примечания добавлены 8 июля 2014 года: Как Риккардо Мурри указал out, мой ответ ниже показывает только, отвечает ли процессор на поддержку гиперпотока. Как правило, * nix O /S настроены на включение hyperthreading, если они поддерживаются. Тем не менее, чтобы действительно проверить это программно, посмотрите ответ Нильса !

---- Оригинальный ответ от 25 марта 2012 года:

Вы действительно на правильном пути :) с помощью

В Linux я вообще просто ищу «ht» в строке «flags» из /proc/cpuinfo . См. Например

или если вы хотите включить «ht» в шаблон

( \b соответствует границам слов и помогает избежать ложных срабатываний в случаях, когда «ht» является частью другого флага.)

Я всегда использовал следующее и смотрел «Thread (s) на ядро:».

Обратите внимание, что этот метод не сработает, если какой-либо логический процессор отключен с помощью простого

Если количество логических процессоров в два раза превышает количество ядер, у вас есть HT. Используйте следующий скрипт для декодирования /proc /cpuinfo :

В приведенных выше примерах показано, способен ли процессор к HT, но не используется. Последний метод работает, но не серверы с двойным сокетом и виртуальные машины, протестированные на Xenserver , где он не отображает физический процессор, поскольку их нет.

Я обнаружил, что это самый простой и понятный код, который также работал на всех моих тестовых средах. но требует bc .

Я считаю, что это будет работать на всех платформах и расскажет вам, способен ли его процессор, и если он включен. Может быть, немного беспорядочно, но я начинаю писать сценарии. Я тестировал с помощью centos XENSERVER vm, Ubuntu и Openfiler (rpath)

У меня есть похожий классный сценарий здесь , хотелось бы что вы думаете?

Вы можете проверить возможности HT CPU с помощью этой команды

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

Он дает этот вывод на одноядерном процессоре с поддержкой HT:

Вы можете прочитать результат следующим образом:

Этот один лайнер, похоже, делает трюк для меня (требует привилегий root):

Количество потоков в два раза больше, чем количество ядер, поэтому у меня включен hyperthreading.

Или, если вам действительно нужен ваш скрипт perl, как было запрошено .

Этот результат указывает, что HT включен, поскольку номер siblings (12) больше, чем cpu cores (6)

Если вы читаете /sys/devices/system/cpu/cpu0/topology/thread_siblings_list , он вернет список разделенных запятыми списков нитей (например, гипертекстовых «ядер») CPU 0 .

Например, на моем 2-сокетном 6-ядерном Xeon с включенным hyperthreading я получаю:

Но после отключения гиперпотока в BIOS я получаю:

Предполагая, что CPU 0 всегда будет доступен, а затем проверяет файл procfs thread_sibling_list CPU 0 для нескольких узлов или ищет запятую или даже просто что-то большее, чем 0 , укажет, включена ли гиперпоточность.

Я бы ответил в Perl, но 1) я не знаю Perl, и 2) я полагаю, что это решение довольно тривиальное однострочное.

Вот подход на основе python - он также предлагает способы его отключения, если это необходимо.

В Linux это хорошо работает:

В приведенном выше примере у нас есть 2 гнезда NUMA (SOCKET = 1 или 2). У нас есть 16 физических ядер (CORE = 0-15). У каждого CORE есть гиперссылка для родного брата (например, CORE = 0 содержит CPU 0,16.

Мы можем проверить гиперпоток следующим образом:

lscpu -p дает выход формата csv для простого разбора программ.

Лучше вы проверяете lscpu, где вы видите «Thread (s) на ядро: 1», означает только один поток на 1 ядро.

Лот оговорки и что-то в ответах здесь . кажется, ответ не так очевиден. lscpu имеет свой getcha, который применяется к любым «подсчетам ядра и логическим процессорам, а затем сравнивает» ответ. Поскольку вы можете отключить логические процессоры с помощью простой команды echo (. это может иметь решающее значение в большой корпоративной среде, в которой вы, в частности, работаете в режиме turbo).

Вот моя попытка; благодаря @scottbb для вдохновения:

На моих компьютерах на базе Dell Xeon список сестер включает запятую, когда HT включен. На моем ноутбуке он включает дефис (процессор i5-3210m). Поэтому я предпочитаю знаки препинания.

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

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

Шаг 1: Определите процессоры Linux, которые вы хотите отключить:

Ищите процессоры, которые имеют одинаковый «идентификатор ядра», вы хотите отключить одну из каждой пары.

Шаг 2: Отключить процессоры с гиперпоточностью (в моем случае последние четыре из 8 «процессоров», которые видел Linux)

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

Это работает почти так, как я ожидал. виртуальные ядра отключены, теперь, когда я выполняю один процессорный поток, он загружает физическое ядро ​​на 100%. Но использование sysbench --num-threads=1 --test=cpu run с разными num-потоками и включенным и выключенным HT говорит о том, что отключение HT снижает производительность, когда есть много потоков, и даже если есть только один поток, нет смысла отключать HT. Поэтому я предлагаю оставить все как есть: это оптимально. Знаете ли вы, что это за команда, чтобы включить их обратно? Ссылка в начале вашего ответа мертва @ user189035: echo 1 вместо того, echo 0 чтобы включить их снова. @ SergeyP.akaazure, я думаю, что для приложения, предоставляющего финансовые услуги, основной причиной отключения HT является не производительность, а безопасность. @SimonRichter В то время, когда этот вопрос был изначально написан, это было действительно исполнение. SMT / HT был не так хорош в некоторых нагрузках на процессоры той эпохи. Разрушение / Призрак и недавние атаки предвестников произошли несколько лет спустя.

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

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

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

Я работаю на сервере Ubuntu 16.04. Я вижу, что Hype Threading включен, когда я использую команду lscpu.

Я хочу отключить это. Я прошел форумы Ubuntu и здесь и здесь.

Это хорошие дискуссии, почему гиперпоточность может быть не очень хорошей. Но нет окончательного решения о том, как его отключить.

Кто-нибудь может дать инструкции по отключению гиперпоточности? Благодарю.

Это интересный вопрос. Наверное, один из самых интересных за месяцы лично для меня. Как и OP, в моем старом BIOS нет опции отключения Hyper Threading (изобретена в 2012 году, обновлена ​​в 2016 году или около того).

Ошибки Hyper-Threading в Intel Skylake и Kaby Lake:

Любой, кто использует процессоры Intel Skylake или Kaby Lake, должен прочитать отчеты об ошибках Hyper Threading, которые появились пару месяцев назад. В этой истории о регистрации в Великобритании рассказывается, как разработчики Debian обнаружили, как Hyper Threading может привести к сбою и повреждению компьютера.

За последний год в Ask Ubuntu сообщалось о множестве проблем со Skylake, и возникает вопрос, как определить, какие проблемы могли быть вызваны ошибками Hyper Threading.

Этот ответ делится на три части:

  • Отображение процессоров, когда Hyper-Threading выключен / включен
  • Скрипт Bash для автоматизации включения / выключения гиперпоточности
  • Conky Сбои, если Hyper Threading отключен до его запуска

Ниже вы можете увидеть загрузку ЦП, когда гиперпоточность отключена и выполняется нагрузочный тест ЦП. Примерно через 10 секунд тот же сценарий повторяется с включенной гиперпоточностью. Наконец, через 10 секунд скрипт запускается с отключенной гиперпоточностью:

Дисплей разделен на две части:

  • В левой половине окна терминала вызывается скрипт set-hyper-threading с параметром 0 (выкл.) и затем 1 (вкл.).
  • На правой половине conky отображает процент использования ЦП CPUS от 1 до 8.

Первый скрипт запускает Hyper Threading

При первом запуске скрипта номера ЦП 2, 4, 6 и 8 (по словам Конки) замораживаются на 3%, 2%, 2% и 2%. При выполнении стресс-теста номера ЦП 1, 3, 5 и 7 достигают 100%.

Топология ЦП отображается с отключенной гиперпоточностью, и сообщается только о четырех ядрах:

Второй скрипт запускает Hyper Threading

Во второй раз, когда скрипт запускается, Hyper-Threading включается, и все процессорные номера 1-8 увеличиваются до 100% во время стресс-теста.

Топология ЦП отображается с включенной гиперпоточностью, и сообщается только о четырех ядрах плюс и четырех виртуальных ядрах:

Третий скрипт запускает Hyper Threading

Обратите внимание, как после окончания второго сценария процессоры 2, 4, 6 и 8 работают на холостом ходу 4%, 2%, 3%, 4%. Это важно, потому что в третьем тесте отключение Hyper-Threading показывает процент загрузки процессора, зафиксированный на уровне 4%, 2%, 3%, 4%, а не 3%, 2%, 2% и 2% от первого теста.

Поэтому отключение гиперпоточности просто останавливает виртуальные процессоры в текущем состоянии.

Также обратите внимание, что независимо от того, включен ли Hyper-Threading или нет, сценарий по-прежнему отображает "Hyper-Threading Supported".

При просмотре приведенного ниже сценария имейте в виду, что Conky нумерует ЦП от 1 до 8, а Linux нумерует ЦП от 0 до 7.

ПРИМЕЧАНИЕ: программа stress встроен во все системы Debian, производная от Ubuntu. Поэтому вам не нужно загружать и устанавливать какие-либо пакеты для запуска этого скрипта в Ubuntu.

Кредит Hi-Angel для bash line grep "" /sys/devices/system/cpu/cpu*/topology/core_id отображение топологии процессора.

Чтобы получить максимально возможную загрузку процессоров 2, 4, 6, 8, я попытался отключить Hyper-Threading во время загрузки. Я использовал этот скрипт для этого:

тем не мение conky вылетает из-за ошибки сегментации, если при запуске гиперпоточность отключена. Таким образом, я должен был закомментировать четыре @reboot строки в скрипте.

Conky Code для отображения процента использования процессора и коэффициента загрузки

Если вы заинтересованы в настройке подобного дисплея в Conky, вот соответствующий фрагмент кода:

ПРИМЕЧАНИЕ. Приведенный выше код Nvidia никогда не тестировался, потому что у меня еще нет графического процессора Nvidia, работающего под Ubuntu. Любой год скоро сейчас:)

Я запускаю сервер ubuntu 16.04. Я вижу, что потоковая реклама включена, когда я использую команду lscpu.

Я хочу ее отключить. Я прошел через форумы ubuntu и здесь и здесь.

Это хорошие обсуждения, почему гиперпоточность может быть не очень хорошей. Но нет окончательного решения о том, как отключить его.

Можно ли дать инструкции по отключению гиперпотока? Спасибо.

$ cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list \ > | sort --unique --numeric-sort 0,16 1,17 2,18 3,19 4,20 5,21 6,22 7,23 8,24 9,25 10,26 11,27 12,28 13,29 14,30 15,31

Для различных целей вы также можете посмотреть в файлах

/sys/devices/system/cpu/present /sys/devices/system/cpu/online /sys/devices/system/cpu/offline

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

Идея HT состоит в наличии нескольких наборов процессоров регистры для каждого физического ядра (так называемые виртуальные ядра). Нет «лучшего» виртуального ядра, они идентичны.

Сначала вы хотите узнать, какая пара виртуальных ядер принадлежит физическому ядру в файловой системе /sys/. Вы можете использовать файл core_id для этого:

λ grep "" /sys/devices/system/cpu/cpu*/topology/core_id /sys/devices/system/cpu/cpu0/topology/core_id:0 /sys/devices/system/cpu/cpu1/topology/core_id:2 /sys/devices/system/cpu/cpu2/topology/core_id:0 /sys/devices/system/cpu/cpu3/topology/core_id:2

Из вывода вы можете сделать вывод, что cpu0 + cpu2 содержатся в одном физическом ядре, а cpu1 + cpu3 - в другом. Теперь добавьте привилегии и используйте команду echo, чтобы отключить ее в каждой паре:

Обратите внимание, что cpu0 не имеет «онлайн-файла» и не может быть отключен, поэтому я отключил cpu2 .

Вот сценарий для идентификации ht-ядер и переключения их в онлайн / офлайн.

@ WinEunuuchs2Unix, может быть, вы можете добавить это к своему отличному ответу.

Это интересный вопрос. Наверное, один из самых интересных в месяцах для меня лично. Как и OP, нет возможности отключить Hyper Threading в моем старом BIOS (изобретен 2012, обновлено 2016 или около того).

Ошибки гипертекста в Intel Skylake и Kaby Lake:

Любой, кто использует процессоры Intel Skylake или Kaby Lake, должен прочитать отчеты об ошибках в Hyper Threading, которые появились пару месяцев назад. В этой истории в британском регистре рассказывается, как разработчики Debian заметили, как Hyper Threading может сбой и повреждение машины.

В прошлом году у Skylake появилось множество проблем, о которых сообщалось в Ask Ubuntu, и каждый задается вопросом, как определить, какие проблемы могут быть вызваны ошибками Hyper Threading.

Этот ответ разделен на три части:

Отображение процессоров, когда Hyper-Threading выключен / включен скрипт Bash для автоматизации выключения гиперпотока при включении Conny Crashes, если Hyper Threading выключен до его запуска ]

Ниже вы можете увидеть использование ЦП при отключении гиперпотока и провести стресс-тест ЦП. Примерно через 10 секунд повторяется один и тот же сценарий с включенной гиперпотокой. Наконец, через 10 секунд сценарий запускается с гиперпотоком, выключенным снова:

Дисплей разделен на две части:

Дисплей CPU, когда Hyper-Threading выключен / включен В правой половине conky отображается процентное использование CPU с CPUS 1 до 8.

Первый запуск скрипта Hyper Threading off

При первом запуске скрипта CPU Numbers 2, 4, 6 & amp; 8 (согласно Конки) заморожены на 3%, 2%, 2% и 2%. Число CPU 1, 3, 5 и 7 достигает 100%, пока выполняется стресс-тест.

Топология CPU отображается с отключением гиперпотока и сообщены только четыре ядра:

/sys/devices/system/cpu/cpu0/topology/core_id:0 /sys/devices/system/cpu/cpu2/topology/core_id:1 /sys/devices/system/cpu/cpu4/topology/core_id:2 /sys/devices/system/cpu/cpu6/topology/core_id:3

Второй скрипт запускает Hyper Threading на

Во второй раз, когда запущен скрипт, включен режим Hyper-Threading, а все номера CPU 1-8 достигают 100% при выполнении стресс-теста.

Топология ЦП отображается с включенной гиперпотокой, и сообщалось только четыре ядра плюс четыре виртуальных ядра:

/sys/devices/system/cpu/cpu0/topology/core_id:0 /sys/devices/system/cpu/cpu1/topology/core_id:0 /sys/devices/system/cpu/cpu2/topology/core_id:1 /sys/devices/system/cpu/cpu3/topology/core_id:1 /sys/devices/system/cpu/cpu4/topology/core_id:2 /sys/devices/system/cpu/cpu5/topology/core_id:2 /sys/devices/system/cpu/cpu6/topology/core_id:3 /sys/devices/system/cpu/cpu7/topology/core_id:3

Третий запуск скрипта Hyper Threading off

Обратите внимание, что после завершения второго скрипта процессоры 2, 4, 6 и 8 работают на холостом ходу на 4%, 2%, 3%, 4%. Это важно, потому что в третьем тестовом режиме выключение Hyper-Threading показывает, что проценты CPU замерзают на 4%, 2%, 3%, 4%, а не 3%, 2%, 2% и 2% от первого теста.

Поэтому выключение гиперпоточности, по-видимому, просто затормозит виртуальные процессоры в текущем состоянии.

Также обратите внимание, независимо от того, включен или выключен Hyper-Threading. Скрипт все еще отображает «Hyper Threading Поддерживается ".

При просмотре сценария ниже помните, что Conky выводит ЦП с 1 до 8, но Linux задает процессоры от 0 до 7.

ПРИМЕЧАНИЕ. Программа stress встроена во все системы Debian, которые Ubuntu является производным от. Поэтому вам не нужно загружать и устанавливать любые пакеты для запуска этого скрипта в Ubuntu.

Подтвердить для строки bash grep "" /sys/devices/system/cpu/cpu*/topology/core_id, отображающей топологию ЦП.

Чтобы получить CPU 2, 4, 6, 8 до самого низкого процента использования, я попытался отключить Hyper-Threading во время загрузки. Я использовал этот скрипт для этого:

Однако conky выходит из строя с ошибкой сегментации, если гиперпоточность отключается при ее запуске. Таким образом, мне пришлось прокомментировать четыре строки @reboot в сценарии.

Код Conky для отображения коэффициента использования процентов и коэффициента загрузки процессора

Если вы заинтересованы в создании аналогичного Отображение в Conky здесь - соответствующий фрагмент кода:

ПРИМЕЧАНИЕ: Код Nvidia выше никогда не тестировался, потому что у меня еще нет графического процессора Nvidia под Ubuntu , Любой год скоро:)

Читайте также: