Я читал в нескольких местах, что планировщик Linux по умолчанию с поддержкой hyperthreading на многоядерных машинах, что означает, что если у вас есть машина с 2 реальными ядрами (4 HT), она не будет планировать два занятых потока на логические ядра таким образом, чтобы они оба работали на одних и тех же физических ядрах (что во многих случаях приводило бы к 2-х издержкам).
Но когда я запускаю stress -c 2
(порождает два потока для запуска на 100% процессоре) на моем Intel i5-2520M, он часто планирует (и сохраняет) два потока на HT ядра 1 и 2, которые сопоставляются с одним и тем же физическим ядром. Даже если система не работает в противном случае.
Это также происходит с реальными программами (я использую stress
здесь, потому что это позволяет легко воспроизвести), и когда это происходит, моя программа, по понятным причинам, занимает в два раза больше времени для запуска. Настройка привязки вручную с помощью taskset
исправляет, что для моей программы, но я ожидал бы, что планировщик, поддерживающий HT, сделает это правильно сам по себе.
Вы можете найти HT- > физическое ядро с помощью egrep "processor|physical id|core id" /proc/cpuinfo | sed 's/^processor/\nprocessor/g'
.
Итак, мой вопрос: Почему планировщик помещает мои потоки в одно и то же физическое ядро здесь?
Примечания:
- Этот вопрос очень похож на этот другой вопрос, ответы на которые говорят, что Linux имеет довольно сложный планировщик потоков, который известен HT. Как описано выше, я не могу наблюдать этот факт (проверьте себя
stress -c
) и хотел бы знать, почему. - Я знаю, что я могу настроить совместимость процессоров вручную для моих программ, например. с помощью инструмента
taskset
или с помощью функцииsched_setaffinity
. Это не то, что я ищу, я бы ожидал, что планировщик сам знает, что отображение двух занятых потоков в физическое ядро и оставление одного физического ядра полностью пустым - не очень хорошая идея. - Я знаю, что есть некоторые ситуации, в которых вы предпочли бы, чтобы потоки были запланированы на одно и то же физическое ядро и оставили другое ядро свободным, но кажется бессмысленно, что планировщик будет делать примерно 1/4 из этих случаев. Мне кажется, что ядра HT, которые он выбирает, являются полностью случайными, или, возможно, те HT-ядра, которые имели наименьшую активность во время планирования, но это не было бы очень гиперпотоком, учитывая, насколько ясно программы с характеристиками
stress
извлекайте выгоду из работы на отдельных физических ядрах.