2

我正在调试接收 RTP 的 C++ 程序的丢包问题。在我的程序运行了很长时间接收大量 RTP 数据后,它开始丢失数据包。

使用 Wireshark 进行跟踪会显示丢失的数据包,但我的应用程序从未收到它们。似乎网络堆栈在将它们交付给应用程序之前将它们丢弃。重新启动我的应用程序后,一切都恢复正常。

为了产生错误情况,我用 RTP 使机器超载,当时丢包发生,这是有充分理由的。但是即使在我停止过载并开始以中等速率发送之后,仍然会发生丢包,我必须重新启动我的应用程序才能再次接收所有数据。

这是 Linux 接收缓冲区处理的问题吗?我可以检查哪些 Linux 统计信息来查看那些丢失的数据包去了哪里?

4

1 回答 1

4

您消耗 UDP 输入的速度不够快。以下是缓解这种情况的一些常用步骤:

  • 切换到recvmmsg(2)如果您的内核支持它以减少系统调用开销,
  • 预分配输入处理期间使用的所有内存,
  • 分析您的应用程序,查找热点并进行优化,
  • 也许农场处理到单独的线程,但保持锁定范围尽可能小,
  • 增加你的套接字接收缓冲区setsockopt(2)),
于 2012-12-18T14:05:33.423 回答