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