2016-09-14 56 views
0

我在以太网上运行客户端服务器配置,并测量两端的数据包延迟。客户端(windows)每隔5毫秒发送一次数据包(用线鲨鱼确认)。然而,服务器(嵌入式linux)仅以5毫秒的间隔接收数据包几秒钟,此时停止300毫秒。休息之后,延迟只有20美分。再过几秒钟后,又需要300毫秒的时间。这无限重复(300ms中断,20us数据包延迟突发)。看起来好像服务器程序正在优化中,以更短的突发读取IO。这是为什么发生?为什么UDP数据包接收似乎优化中执行?

免责声明:我还没有发布的代码,为客户端和服务器的更复杂的应用小的子集,但是,我愿意因素出来,如果一个显而易见的答案并不存在本身。

+0

是否收到所有的数据包? – EJP

+0

我相信如此。我明天可以验证这一点。 – Ralph

+0

你如何测量20 us的延迟?是否有任何请求响应?你有原子钟吗?数据报的大小是多少? – rodolk

回答

0

我昏昏沉沉地测量到1每1000个数据包,现在它表现自己。我每5ms使用printf,它必须最终完全填充printf tx队列。然后这延迟了300ms的执行。一旦printf喘不过气来,程序就有一个队列充满了传入的数据包,因此似乎每20个美国人就接收一次数据包。

1

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

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

+0

对于不提供更多信息,我表示歉意。程序中只有两个线程,另一个线程(另一个udp服务器)没有被提供任何数据。另外,当测量结果被采纳时,我感兴趣的线程所处理的“处理”被注释掉了。 – Ralph