Это ответ только для Windows, но следующие изменения в свойствах карты сетевого контроллера привели к разнице в DRAMATIC потери пакетов для нашего варианта использования.
Мы потребляем около 200 Мбит / с данных UDP и испытываем значительную потерю пакетов при умеренной нагрузке на сервер.
Используемая сетевая карта - это карта Asus ROG Aerion 10G , но я ожидаю, что большинство высокопроизводительных сетевых контроллеров будут иметь аналогичные свойства. Вы можете получить к ним доступ через Диспетчер устройств-> Сетевая карта-> Правой кнопкой мыши-> Свойства-> Дополнительные параметры .
1. Увеличьте количество приемных буферов:
Значение по умолчанию было 512; мы могли бы увеличить его до 1024. В нашем случае более высокие настройки были приняты, но сетевая карта отключается после того, как мы превысим 1024. Наличие большего количества доступных буферов на уровне сетевой карты дает системе больше терпимости к задержке при передаче данные из буферов сетевой карты в буферы сокетов, где наши приложения, наконец, смогут читать данные.
2. Установите для параметра «Скорость прерывания» значение «Выкл.»:
Если я правильно понял, модерация прерываний объединяет несколько уведомлений о «заполнении буфера» (через прерывания) в одно уведомление. Таким образом, ЦП будет прерываться реже и извлекать несколько буферов во время каждого прерывания. Это уменьшает загрузку ЦП, но увеличивает вероятность того, что готовый буфер будет перезаписан перед извлечением, если прерывание будет обработано поздно.
Кроме того, мы увеличили размер буфера сокета (как уже сделал OP), а также включили Циклическая буферизация на уровне сокета, как предложено Len Holgate в комментарии, Также следует увеличить допуск к задержке при обработке буферов сокетов.