Выжимаем максимум из сетевой карты
В данных заметках собраны рецепты по оптимизации передачи трафика между двумя узлами.
Contents
Проблема
Современные сетевые карты достигли скорости 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 сегментов в больший буфер перед отправкое его выше в сетевой стек
- Подсчет контрольных сумм
- И так далее