为什么UDP数据包接收在执行中看似优化?

时间:2016-09-14 23:26:11

标签: sockets network-programming udp

我通过以太网运行客户端服务器配置并测量两端的数据包延迟。客户端(窗口)每5毫秒发送一次数据包(用线鲨确认)。然而,服务器(嵌入式Linux)仅以5毫秒的间隔接收数据包几秒钟,此时它会停止300毫秒。在此休息之后,延迟仅为20 us。在大约几秒钟的另一段时间之后,需要再次休息300毫秒。这无限期地重复(300ms中断,20 us数据包延迟突发)。似乎服务器程序在执行中被优化以在更短的突发中读取IO。为什么会这样?

免责声明:我没有发布代码,因为客户端和服务器是更复杂的应用程序的小子集,但是,如果一个明显的答案并不存在,我愿意将其分解出来。 / p>

2 个答案:

答案 0 :(得分:1)

这是UDP,因此没有握手或任何流量控制机制。这300毫秒必须是因为服务器在处理收到的UDP消息时所做的工作。在这300毫秒期间,服务器肯定丢失了大约60条未从客户端读取的消息。

如果服务器使用一个线程进行处理,您可能希望检查服务器在处理每条消息时花费不超过5毫秒。如果服务器使用多线程来处理消息并且处理需要一些时间,即使需要1毫秒,您可能会遇到某种情况,在某些时候所有线程都在竞争资源并且它们不能完成是时候阅读下一条消息了。对于你所描述的问题,我敢打赌服务器是多线程的,你有这个问题。我不能保证100%因为缺乏信息。但无论如何,您需要检查处理消息所需的时间,因为您可能正在处理实时要求。

答案 1 :(得分:0)

我将每1000个数据包中的测量值间隔为1,现在它表现得很好。我每5ms使用一次printf,最终必须完全填充printf tx队列。然后将执行延迟了300ms。一旦printf屏住呼吸,程序就会有一个充满传入数据包的队列,因此看起来每20 us就会收到一个数据包。