разница между набором задач и процессором

8

Я пытаюсь уменьшить задержку моего сетевого приложения Linux. Я узнал, что есть два инструмента для «привязки» программы к конкретному ядру процессора: taskset и cpuset.

  1. Какой из них я предпочитаю? Они эквивалентны на более низком уровне?
  2. (расположение) Мое приложение имеет один поток и должно обрабатывать одно TCP-соединение (без повторного подключения) по быстрой локальной сети с минимальной задержкой. Я на правильном пути?
Джон Линберг
источник
Вы читали их соответствующие страницы руководства?
Майкл Хэмптон
Вы запустили детальное профилирование, чтобы быть уверенным, что задержка вызывает сетевая часть Linux, а не приложение?
Теро Килканен
Какую ОС / дистрибутив / версию / ядро ​​вы используете?
ewwhite
Кроме того, какой тип оборудования задействован?
Марка

Ответы:

12

Набор задач предназначен для привязки процесса к одному или нескольким процессорам; по существу, указание, где он может работать при первоначальном выполнении или во время работы. При использовании RHEL / CentOS на современном серверном оборудовании, numactlрекомендуется закончить taskset.

Cpuset / cset предназначен для экранирования ЦП и является фреймворком, основанным на cgroups Linux. Cset никогда не был популярен в определенных дистрибутивах (например, RHEL), потому что есть другие инструменты, доступные для управления процессами.

Первая команда ниже создает экран, который будет ограничивать задачи операционной системы ядрами ЦП 0 и 8. Вторая будет перемещать текущий сеанс оболочки на указанный экран ЦП, что приведет к изоляции системных и пользовательских процессов.

# cset shield --cpu 1-7,9-15 --kthread=on
# cset proc --move --pid=$$ --threads --toset=user

Есть и другие вещи, которые можно проверить и настроить, прежде чем идти по пути привязки процессов к процессорам; прерывания ( irqbalanceчастичное отключение), настройки энергосбережения, системный планировщик, лифты ввода-вывода, политика в реальном времени ( chrt).

Смотрите: Настройки TCP с низкой задержкой в ​​Ubuntu

Вот ( извитый ) пример приложения - оболочки , который выбирает ядро, останавливает irqbalance, запускает его и черные списки выбранного сердечника, затем выполняет ./your_program с SCHED_FIFO и приоритетом 99 на выбранном ядре.

Core=5
CoreMask=`echo "16 o 2 $Core ^ p" | dc`
service irqbalance stop
  until [ "`service irqbalance status`" = "irqbalance is stopped" ] ; do sleep 1 ; done
IRQBALANCE_ONESHOT=1 IRQBALANCE_BANNED_CPUS=${CoreMask} irqbalance
sleep 1
  until [ "`service irqbalance status`" = "irqbalance is stopped" ] ; do sleep 1 ; done
numactl --physcpubind=${Core} --localalloc chrt -f 99 ./your_program
ewwhite
источник
1
Обратите внимание, что приложение может сбросить свои сродства при использовании taskset. Если вы используете cpuset, невозможно изменить ваши сродства с тем, что дает вам cpuset.
Мэтью Ифе
А numactl??
ewwhite
1
То же самое, обе программы вызывают один и тот же системный вызов sched_setaffinity.
Мэтью Ифе