Почему планировщик Linux размещает два потока на одном физическом ядре на процессорах с HyperThreading?

Я читал в нескольких местах, что планировщик Linux по умолчаниюосведомленность о гиперпоточности на многоядерных машинах, что означает, что если у вас есть машина с двумя реальными ядрами (4 HT), она не будет планировать два занятых потока на логические ядра так, чтобы они оба работали на одних и тех же физических ядрах (что привело бы к 2x стоимость исполнения во многих случаях).

Но когда я бегуstress -c 2 (порождает два потока для запуска на 100% CPU) на моем 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 выиграть от работы на отдельных физических ядрах.

Ответы на вопрос(3)

Ваш ответ на вопрос