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

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

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

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

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

1 ответ

Решение

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

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