TaskControl не работает на разных ядрах в isolcpus

13

В качестве предисловия я использую Debian Wheezy с ядром 3.2 на чипсете AMD64. У моей машины два ядра Xeon E5-2690. Я настроил параметры загрузки так, чтобы все ядра на одном процессоре были выделены для одного процесса. Для этого я установил isolcpus = 8,9,10,11,12,13,14,15 в grub.

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

$ taskset -c 8-15 bash -c 'while true; do echo hello> / dev / null; сделано' &

Пока все хорошо, топ показывает, что ядро ​​8 раскручивается почти до 100% загрузки. Теперь допустим, что я снова запускаю эту команду:

$ taskset -c 8-15 bash -c 'while true; do echo hello> / dev / null; сделано' &

Теперь сверху показано, что ядра 9-15 остаются бездействующими, а два процесса используют ядро ​​8. Если вместо этого я делаю это:

$ taskset -c 8 bash -c 'while true; do echo hello> / dev / null; сделано' &

$ taskset -c 9 bash -c 'while true; do echo hello> / dev / null; сделано' &

Ядра 8 и 9 получают 100% -ное использование, как и должно быть. Это относится только к isolcpus, потому что тот же набор задач с ядрами 1-7 правильно распределяет процессы по соответствующим ядрам. Кроме того, «taskset -p» показывает, что маска сродства для 8-15 процессов установлена ​​правильно. Похоже, что планировщик ядра отказывается использовать что-либо, кроме самого низкого ядра, указанного в маске схожести isolcpus.

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

У кого-нибудь есть идеи, как заставить планировщик выдавать мне более одного ядра из набора isolcpu?

user79126
источник
Вы можете попробовать использовать многопоточную программу? bash не многопоточный
c4f4t0r
1
Да, именно это заставило меня заметить (моя многопоточная программа не использовала более одного ядра). Простой скрипт на python, который создает множество потоков, не может использовать более одного ядра при запуске на множестве isolcpus. (При работе на неизолированных ядрах используются все доступные 8 ядер).
user79126
прочтите этот linuxtopia.org/online_books/linux_kernel/kernel_configuration/… , это исключает процессор из планировщика ядра, но после исключения процессора вы хотите запустить процесс на исключенном процессоре?
c4f4t0r
1
Ядро не будет планировать поток или процесс в isolcpu, если маска соответствия процессора не указывает, что его следует использовать. В противном случае isolcpus будет таким же, как и выключение ядра, когда цель состоит в том, чтобы зарезервировать ядро ​​по определенной пользователем причине и убедиться, что ни один нежелательный процесс не использует его. Taskset устанавливает маску сродства для использования всех ядер в диапазоне 8-15 (который устанавливается правильно при проверке в / proc), поэтому ядро ​​должно планировать процесс на незанятых ядрах.
user79126

Ответы:

10

После дня разочарования я нашел решение. Такое поведение кажется артефактом алгоритма планировщика ядра по умолчанию (SCHED_OTHER для этого дистрибутива / ядра). Изменение процесса на другой алгоритм устраняет проблему, изоляция адекватно используется во всех процессах / потоках.

В итоге я использовал SCHED_RR, но я также протестировал SCHED_FIFO и SCHED_IDLE, оба из которых, похоже, работают. Процесс можно запустить с помощью альтернативного алгоритма с помощью утилиты chrt:

$ sudo chrt -r 1 [команда]

(Если вы хотите работать без полномочий root, вы можете использовать утилиту setcap, чтобы включить CAP_SYS_NICE в двоичном файле, связанном с командой)

user79126
источник
1
Несмотря на то, что задачи были связаны с ядрами 0,1, в моем java-приложении использовалось только первое ядро. 'sudo chrt -r 1 [команда]' тоже решила мою проблему.
Барри NL