Назад | Перейти на главную страницу

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

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

  1. Что мне предпочесть? Они эквивалентны на более низком уровне?
  2. (расположение) Мое приложение имеет один поток и должно обрабатывать одно TCP-соединение (без повторного подключения) через быструю локальную сеть с минимально возможной задержкой. Я на правильном пути?

Набор задач для привязки процесса к одному или нескольким процессорам; по существу уточняя где он может работать при первоначальном выполнении или во время его работы. Если вы используете 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