В техническом документе поставщика говорится: 5Mpps — без проблем. Я уже уперся в стену на 120kpps. Где узкое место?

В техническом документе поставщика говорится: 5Mpps — без проблем. Я уже уперся в стену на 120kpps. Где узкое место?

HP'sтехнический документ по адаптерам QLogic (ранее Broadcom) NetXtreme II, в том числе и конкретная сетевая карта, которую я тестирую, утверждает (стр. 7), что ее производительность при обработке небольших пакетов размером до 256 байт/пакет превышает 5 000 000 пакетов/сек.

В моих тестах с приложением, где я отключил всю обработку, кроме части получения UDP, я могу получить только 120 000 пакетов/сек. Пакеты равномерно распределяются по 12 группам многоадресной рассылки.

Я заметил, что естьодно ядро(из 12 ядер на каждом из двух сокетов), нагрузка на которые постепенно увеличивается, когда я увеличиваю скорость отправки UDP имаксимум около 120 000. Но я не знаю, что делает это ядро ​​и почему. Это не узкое место одного потока в моем приложении, потому что неважно, запускаю ли я один экземпляр приложения для всех групп многоадресной рассылки или 12 экземпляров, каждый из которых обрабатывает одну группу многоадресной рассылки. Так что узкое место — это не мое приложение-приемник.

MSI включен (проверено черезВид «ресурсы по типу» в диспетчере устройств) и RSS тоже включен в настройках NIC, с 8 очередями. Так что же цепляется за это ядро? Все функции разгрузки NIC сейчас включены, но их отключение не помогло.

Так где же может быть узкое место?

Подробности системы:

  • ProLiant BL460c Gen9
  • Intel Xeon E5-2670 v3 (2 x 12 ядер)
  • Сетевая карта HP FlexFabric 10Gb 2-портовая 536FLB
  • Windows 2012 R2

решение1

RSS также включен в настройках сетевой карты с 8 очередями.

Что, к сожалению, не означало, что RSS использовался, поскольку

netsh int tcp show global

показал:

TCP Global Parameters
----------------------------------------------
Receive-Side Scaling State : disabled

После запуска (кстати, без перезагрузки)

netsh int tcp set global rss=enabled

RSS начал работать, и нагрузка, которая раньше ложилась на одно бедное ядро, теперь равномерно распределяется по многим ядрам на одном из двух узлов NUMA.

Я не проверял, позволит ли это мне справиться с заявленными нагрузками Mpps, но потолок был поднят достаточно, чтобы оценить то, что мне нужно.

Связанный контент