Когда сетевой стек Linux отбрасывает полученные пакеты RTP?

Я отлаживаю проблему потери пакетов с моей программой C ++, получающей RTP.
После того, как моя программа довольно долго работала, получая много RTP-данных, она начинает терять пакеты.

Трассировка с Wireshark показывает отсутствующие пакеты, но мое приложение никогда не получает их. Кажется, сетевой стек отбрасывает их перед доставкой в ​​приложение. После перезапуска моего приложения все возвращается на круги своя.

Чтобы создать состояние ошибки, я перегружаю машину RTP, и в это время происходит потеря пакетов, и на то есть веские причины. Но даже после того, как я прекращаю перегрузку и начинаю отправку с умеренной скоростью, потеря пакетов все еще происходит, и мне приходится перезапускать мое приложение, чтобы снова получить все данные.

Это проблема с обработкой буфера приема Linux? Какую статистику Linux я могу проверить, чтобы увидеть, куда эти пропущенные пакеты идут?

1

Решение

Вы не используете свой ввод UDP достаточно быстро. Вот некоторые обычные шаги, которые нужно предпринять, чтобы смягчить это:

  • Переключиться на recvmmsg(2) если ваше ядро ​​поддерживает это, чтобы уменьшить затраты системных вызовов,
  • Предварительно распределить всю память, используемую во время обработки ввода,
  • Профилируйте свое приложение, находите горячие точки и оптимизируйте,
  • Может быть, обработка фермы для отдельных потоков, но сохранить область блокировки как можно меньше,
  • Увеличьте вашу розетку приемный буфер (setsockopt(2)),
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]