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

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

Для этого:

В опциях ядра прописывается изоляция ядер обработчика пакетов через параметры isolcpus=... и rcu_nocbs=.... Кроме этого рекомендуется добавить rcu_nocb_poll, audit=0, nosoftlockup и mce=ignore_ce.

В .env добавлются параметры:

  • DPCPUS - список ядер, выделенных под обработчик пакетов (data-plane);
  • SRVCPUS - список ядер, выделенных под остальные подсистемы (все остальные ядра).

В docker-compose.override.yml эти ядра прописываются через настройку cpuset (DPCPUS - для data-plane, SRVCPUS - для всего остального):

version: "2.2"
services:
  data-plane:
    cpuset: ${DPCPUS}

  postgres:
    cpuset: ${SRVCPUS}

  backend:
    cpuset: ${SRVCPUS}

  nginx:
    cpuset: ${SRVCPUS}

  fwstats:
    cpuset: ${SRVCPUS}

  watchhog:
    cpuset: ${SRVCPUS}

  rts:
    cpuset: ${SRVCPUS}

  clickhouse:
    cpuset: ${SRVCPUS}

  graphite-clickhouse:
    cpuset: ${SRVCPUS}

  carbon-clickhouse:
    cpuset: ${SRVCPUS}

  carbonapi:
    cpuset: ${SRVCPUS}

  grafana:
    cpuset: ${SRVCPUS}

Пример

  • Два CPU по 10 физических ядер с HyperThreading, итого 40 логических ядер:
CPU0: 0-9,20-29
CPU1: 10-19,30-39
  • Под data-plane выделяются все ядра с каждого CPU кроме одного, включая парные:
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 rcu_nocb_poll audit=0 nosoftlockup mce=ignore_ce"

.env:

DPCPUS=0-8,10-18,20-28,30-38
SRVCPUS=9,19,29,39

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