Linux网络堆栈何时丢弃收到的RTP数据包?

时间:2012-12-18 11:37:54

标签: c++ debugging sockets rtp packet-loss

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

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

为了产生错误条件,我使用RTP使机器过载,此时发生丢包并且有充分的理由。但即使我停止过载并开始以适中的速率发送,仍然会发生数据包丢失,我必须重新启动应用程序才能再次接收所有数据。

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

1 个答案:

答案 0 :(得分:3)

您没有足够快地消耗UDP输入。以下是为缓解这一点而采取的一些常规步骤:

  • 如果内核支持它,请切换到recvmmsg(2)以减少系统调用开销,
  • 预先分配输入处理期间使用的所有内存,
  • 分析您的应用,查找热点并进行优化,
  • 也许将场处理为单独的线程,但保持锁定范围尽可能小,
  • 增加套接字receive buffersetsockopt(2)),