Я отлаживаю проблему потери пакетов с моей программой C ++, получающей RTP.
После того, как моя программа довольно долго работала, получая много RTP-данных, она начинает терять пакеты.
Трассировка с Wireshark показывает отсутствующие пакеты, но мое приложение никогда не получает их. Кажется, сетевой стек отбрасывает их перед доставкой в приложение. После перезапуска моего приложения все возвращается на круги своя.
Чтобы создать состояние ошибки, я перегружаю машину RTP, и в это время происходит потеря пакетов, и на то есть веские причины. Но даже после того, как я прекращаю перегрузку и начинаю отправку с умеренной скоростью, потеря пакетов все еще происходит, и мне приходится перезапускать мое приложение, чтобы снова получить все данные.
Это проблема с обработкой буфера приема Linux? Какую статистику Linux я могу проверить, чтобы увидеть, куда эти пропущенные пакеты идут?
Вы не используете свой ввод UDP достаточно быстро. Вот некоторые обычные шаги, которые нужно предпринять, чтобы смягчить это:
recvmmsg(2)
если ваше ядро поддерживает это, чтобы уменьшить затраты системных вызовов,setsockopt(2)
),Других решений пока нет …