Изоляция ядер для оптимизации производительности

По умолчанию ядра CPU, работающие с сетевыми портами, используются и другими подсистемами. Это может снижать производительность и вызывать всплески Input Errors pps/bps на графиках Port extX/intX. Можно снять часть нагрузки с этих ядер, запретив некритичным подсистемам выполняться на них.

Для этого:

  1. В опциях ядра пропишите изоляцию ядер обработчика пакетов через параметры isolcpus=... и rcu_nocbs=.... Также рекомендуется добавить mitigations=off для отключения патчей безопасности ядра.

  2. В .env добавьте параметры:

    • DATA_PLANE_CPUS — список ядер, выделенных под обработчик пакетов (dataplane);
    • CONTROL_PLANE_CPUS — список ядер, выделенных под остальные подсистемы (все остальные ядра).
  3. Скачайте docker-compose.cpuisol.yml, применяющий параметр cpuset для всех подсистем:

    wget https://docs.mitigator.ru/master/dist/docker-compose.cpuisol.yml -O /srv/mitigator/docker-compose.cpuisol.yml
  4. Добавьте его в список COMPOSE_FILE в .env:

    COMPOSE_FILE=docker-compose.yml:docker-compose.cpuisol.yml

Пример

  • Сервер с двумя CPU по 10 физических ядер с HyperThreading — всего 40 логических ядер:
CPU0: 0-9,20-29
CPU1: 10-19,30-39
  • Под dataplane выделены все ядра кроме одного с каждого CPU, включая HT-пары:
0-8,10-18,20-28,30-38
  • Оставшиеся ядра отданы остальным подсистемам:
9,19,29,39

Настройка grub:

GRUB_CMDLINE_LINUX_DEFAULT="... isolcpus=0-8,10-18,20-28,30-38 rcu_nocbs=0-8,10-18,20-28,30-38 mitigations=off"

Настройка .env:

DATA_PLANE_CPUS=0-8,10-18,20-28,30-38
CONTROL_PLANE_CPUS=9,19,29,39

Подробнее о параметре cpuset