различие между taskset и cpuset

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

  1. Какой я должен предпочесть? Действительно ли они эквивалентны на более низком уровне?
  2. (расположение) Мое приложение имеет единственный поток и, как предполагается, обрабатывает единственное соединение TCP (не снова соединяются) по быстрой локальной сети с наименее возможной задержкой. Я нахожусь на правильном пути?
8
задан 30 August 2014 в 12:13
1 ответ

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

Cpuset/cset предназначен для экранирования процессора и представляет собой фреймворк, построенный на базе Linux cgroups. 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
12
ответ дан 2 December 2019 в 22:54

Теги

Похожие вопросы