Вот что я сделал до сих пор:
Использование большего количества буферов Rx / Tx увеличивает производительность по сравнению с настройками по умолчанию. Я установил для RSS Queues значение 4 для каждого адаптера и указал для запуска RSS CPU на втором порте значение, отличное от 0 (это 16 на используемом мной ПК, с 16 ядрами, 32 HT).
Наблюдая за ProcessExplorer, я ограничен способностью ЦП обрабатывать большое количество входящих прерываний даже при включенном RSS. Я использую слот PCIe x8 (электрический) в режиме 2.x. Каждый из двух адаптеров подключается к шине 5GT / sec x8.
Скорость реакции ОС не имеет значения, имеет значение пропускная способность ввода-вывода. Я ограничен неспособностью клиентов обрабатывать Jumbo-пакеты.
Какие настройки я должен попробовать дальше?
Подробности: Dual Xeon-E5 2665, 32 ГБ ОЗУ, восемь твердотельных накопителей в RAID0 (RAMDrive, используемый для проверки производительности сетевой карты), 1 ТБ данных для перемещения через IIS / FTP с 400 клиентов в кратчайшие сроки.
В ответ на комментарии:
Фактическая пропускная способность при чтении составляет 650 МБ / с по объединенной паре каналов 10 ГБ / с на RAM-диск.
Антивирус и брандмауэр выключены, AFAICT. (В этом случае у меня довольно хороший контроль над тем, что установлено на ПК. Как я могу быть уверен, что никакие фильтры не снижают производительность? Мне нужно будет следить, хороший момент.)
В Process Explorer я вижу периоды времени, когда ЦП продолжает работать (красный цвет, время ядра), но сетевой и дисковый ввод-вывод остановлены
Максимальное количество процессоров RSS по умолчанию - 16.
Взаимодействие с сообщением поддерживается на обоих экземплярах устройства X520-DA2, при этом MessageNumberLimit имеет значение 18. Вот что я вижу на своей скромной настольной карте.
Одна из проблем, связанных с высокопроизводительными сетевыми адаптерами, заключается в том, что современная архитектура ПК не выдерживает определенного уровня. Но в вашем случае проблема не в этом. Позволь мне объяснить.
ЦП должен выполнять много работы по обработке TCP-пакетов. Это влияет на пропускную способность. Что ограничивает в вашем случае, так это не сетевое оборудование, а способность сервера загружать сетевые ссылки.
В последнее время мы видели, как обработка перемещается от ЦП к сетевой карте, как разгрузка контрольной суммы. Intel также добавила функции, помогающие еще больше снизить нагрузку. Это круто, и я уверен, что все функции оптимизации включены.
Как вы уже упоминали, jumbo-кадры - на самом деле это несколько увеличивает пропускную способность. Но не так сильно, как RDMA.
Большая часть оборудования Ethernet 10 Гбит / с будет иметь очень полезную малоиспользуемую функцию под названием RDMA или удаленный прямой доступ к памяти. Это позволяет сетевой карте делать копии из памяти в память по сети без вмешательства ЦП. Итак, ЦП сообщает сетевой карте, что делать, а затем сетевая карта делает все остальное. Беда в том, что он пока мало используется. Но дело идет. Судя по всему, в самой последней версии Microsoft Windows Server 2012 есть что-то под названием SMB Direct. Он использует RDMA. Итак, если вы хотите увеличить пропускную способность, вы захотите это использовать.
Можете ли вы собрать тестовое оборудование и установить его там, чтобы посмотреть, как оно работает?
Кстати, я не уверен, что вы так много увидите это на 10 Гбит, но быстрая ОЗУ помогает с RDMA, особенно с 56 Гбит Infiniband. В общем, лучше использовать самую быструю оперативную память, поддерживаемую вашим сервером.
Также обратите внимание на этот комментарий к ссылке SMB Direct, которую я поместил выше:
Не следует объединять сетевые адаптеры с поддержкой RDMA, если вы собираетесь использовать возможности RDMA сетевых адаптеров. В команде сетевые адаптеры не будут поддерживать RDMA.
Обновление: Похоже, что не ВСЕ 10GBit NIC по какой-то причине поддерживают RDMA. Так что сначала проверьте особенности вашей модели.
Еще я подумал, что тип протокола, используемого для тестирования, может влиять на результаты. то есть накладные расходы протокола поверх накладных расходов TCP. Я предлагаю вам изучить что-то, что можно протестировать, не касаясь жесткого диска, например iperf. Где-то есть порт для Windows.
Думаю такой вопрос: Почему моя гигабитная связь не обеспечивает пропускную способность не менее 150 МБ / с? связано с вашей проблемой. Я говорил там о Dell PowerEdge 6950. Ответ прост: «используйте кадры большого размера», чтобы уменьшить количество прерываний. Я могу представить, что настройка механизма разгрузки сетевой карты может помочь в вашем случае, но я не знаю, как это сделать на W2K8R2.
Идея: Увеличьте количество буферов в сетевой карте, увеличьте триггер прерывания для пакетов в буфере, чтобы каждое прерывание обрабатывало больше пакетов (то есть передавало их в стек OS-IP).
См. Эту ссылку: Настройка параметров коалесценции с помощью ethtool на 10 Гб это то, что я в основном имею в виду.
На снимке экрана с загрузкой процессора показаны 2 потенциальных узких места:
Чтобы решить первую проблему:
Что касается последнего (не зная, какое приложение вы на самом деле используете):
Если это 1 ядро с максимальным выходом в пользовательском режиме указывает на ваше однопоточное (или однопоточное) приложение, оно должно быть
использовать несколько ядер, что может быть, а может и нет.
Кроме того, поскольку ваше приложение (если это действительно ваше приложение), очевидно, работает на узле NUMA №1, но обработка пакетов ядром выполняется на узле NUMA №0,
Например. щелкнув правой кнопкой мыши процесс в диспетчере задач, что даст вам возможность изменить это, по крайней мере, в Win2012R2. Я попробовал, и мне это не помогло, но стоит попробовать, так как это может улучшить скорость попадания в кеш.
Кстати, это машина, о которой идет речь? Получение? Обе? С точки зрения настройки производительности вашей системы, отправка и получение почти полностью не связаны, хотя мои предложения выше охватывают и то, и другое.