2012-12-18 31 views
1

我正在调试与我的C++程序接收RTP的丢包问题。 当我的程序运行了很长时间后收到大量RTP数据后,它开始丢失数据包。什么时候Linux网络堆栈丢弃收到RTP包?

使用Wireshark进行跟踪显示丢失的数据包,但我的应用程序永远不会收到它们。看起来,网络堆栈在将它们传递给应用程序之前将其丢弃。重新启动我的应用程序后,一切都恢复正常。

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

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

+3

当你在wireshark中看到它们时,它们到达网络堆栈。 netstat -s可以显示相当多的统计信息,通常您可以得出这样的结论:OS缓冲区已满,因为您的应用程序没有足够快速地收到(或)类似的数据包。 – PlasmaHH

+0

@PlasmaHH:谢谢!如果我的应用程序读取速度不够快,那么netstat -s中的哪些计数器会增加? –

+0

我不知道RTP是如何工作的,并且可用的统计信息在内核版本中有所不同,但是如果基于UDP的话,那么Udp:RcvbufErrors将成为一个强有力的指示器(您可能还想检查缓冲区是否对您而言太小wokrload) – PlasmaHH

回答

3

你没有足够快地消耗你的UDP输入。下面是一些常用的步骤来减轻:

  • 切换到recvmmsg(2)如果你的内核支持的话,以减少系统调用开销,
  • 预分配的输入处理过程中使用的所有内存,
  • 简介您的应用程序,寻找热点和优化,
  • 也许农场加工出单独的线程,但保持锁定范围尽可能小,
  • 提高您的插座receive buffersetsockopt(2)),