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