В качестве предисловия я использую 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?
Ответы:
После дня разочарования я нашел решение. Такое поведение кажется артефактом алгоритма планировщика ядра по умолчанию (SCHED_OTHER для этого дистрибутива / ядра). Изменение процесса на другой алгоритм устраняет проблему, изоляция адекватно используется во всех процессах / потоках.
В итоге я использовал SCHED_RR, но я также протестировал SCHED_FIFO и SCHED_IDLE, оба из которых, похоже, работают. Процесс можно запустить с помощью альтернативного алгоритма с помощью утилиты chrt:
$ sudo chrt -r 1 [команда]
(Если вы хотите работать без полномочий root, вы можете использовать утилиту setcap, чтобы включить CAP_SYS_NICE в двоичном файле, связанном с командой)
источник