Выжимаем максимум из сетевой карты

From Genrietta
Jump to: navigation, search

В данных заметках собраны рецепты по оптимизации передачи трафика между двумя узлами.

Проблема

Современные сетевые карты достигли скорости 200Гбит/с (например, Mellanox ConnectX-6). С такими картами, передача данных в один поток обычным способом не может достигнуть wire speed. Проблемой здесь становится CPU.

Общие рецепты

Множество потоков

Если узким местом становится CPU, то здравым решением будет распределить нагрузку на множество процессоров. Для достижения этого используются техники, изложенные для обеих сторон ниже.

PCI-E шина

PCI-E шина подключается к CPU или chipset (южному мосту). Соответственно, необходимо вешать потоки отправки/приема на ядра процессора, к которому PCI-E шина подключена. Определить список таких логических процессоров можно командой:

cat /sys/class/net/eth0/device/local_cpulist

Если сетевой интерфейс карты другой, то нужно заменить eth0 в команде.

Hyper-Threading

Определить какие логические CPU относятся к одному физическому ядру можно из /proc/cpuinfo. Необходимо смотреть на поля processor, physical id, core id. Для большей производительности необходимо разбрасывать агрессивные задачи по одной на физическое ядро.

Offloads

Некоторые карты способны выполнять определенные задачи, разгружая CPU:

  • Разбивка большого TCP сегмента на мелкие и их отправка
  • Сборка выходящих TCP сегментов в больший буфер перед отправкое его выше в сетевой стек
  • Подсчет контрольных сумм
  • И так далее

Сторона отправитель

Множество потоков

TCP и LFN

Сторона получатель

Receive side scaling

Bandwidth-delay

Ссылки