1
我正在调试与我的C++程序接收RTP的丢包问题。 当我的程序运行了很长时间后收到大量RTP数据后,它开始丢失数据包。什么时候Linux网络堆栈丢弃收到RTP包?
使用Wireshark进行跟踪显示丢失的数据包,但我的应用程序永远不会收到它们。看起来,网络堆栈在将它们传递给应用程序之前将其丢弃。重新启动我的应用程序后,一切都恢复正常。
为了生成错误条件,我使用RTP重载机器,并在此时发生数据包丢失,并有充分的理由。但即使在我停止过载并以适度的速率开始发送之后,数据包仍会丢失,我必须重新启动应用程序才能再次接收所有数据。
这是Linux接收缓冲区处理的问题吗?我可以检查哪些Linux统计数据以查看丢失数据包的位置?
当你在wireshark中看到它们时,它们到达网络堆栈。 netstat -s可以显示相当多的统计信息,通常您可以得出这样的结论:OS缓冲区已满,因为您的应用程序没有足够快速地收到(或)类似的数据包。 – PlasmaHH
@PlasmaHH:谢谢!如果我的应用程序读取速度不够快,那么netstat -s中的哪些计数器会增加? –
我不知道RTP是如何工作的,并且可用的统计信息在内核版本中有所不同,但是如果基于UDP的话,那么Udp:RcvbufErrors将成为一个强有力的指示器(您可能还想检查缓冲区是否对您而言太小wokrload) – PlasmaHH