Sockets 为什么UDP数据包接收在执行过程中似乎得到了优化?

Sockets 为什么UDP数据包接收在执行过程中似乎得到了优化?,sockets,network-programming,udp,Sockets,Network Programming,Udp,我正在通过以太网运行客户机-服务器配置,并测量两端的数据包延迟。客户端(windows)应每5毫秒发送一次数据包(通过wire shark确认)。然而,服务器(嵌入式linux)只在几秒钟内以5毫秒的间隔接收数据包,在这一点上它会停止300毫秒。在此中断之后,延迟只有20秒。在大约几秒钟的另一段时间后,它需要另一个300毫秒的中断。这将无限期地重复(300毫秒中断,20秒数据包延迟突发)。似乎服务器程序在执行过程中进行了优化,以在较短的时间内读取IO。为什么会这样 免责声明:我没有发布代码,因为

我正在通过以太网运行客户机-服务器配置,并测量两端的数据包延迟。客户端(windows)应每5毫秒发送一次数据包(通过wire shark确认)。然而,服务器(嵌入式linux)只在几秒钟内以5毫秒的间隔接收数据包,在这一点上它会停止300毫秒。在此中断之后,延迟只有20秒。在大约几秒钟的另一段时间后,它需要另一个300毫秒的中断。这将无限期地重复(300毫秒中断,20秒数据包延迟突发)。似乎服务器程序在执行过程中进行了优化,以在较短的时间内读取IO。为什么会这样


免责声明:我没有发布代码,因为客户机和服务器是更复杂应用程序的小子集,但是,如果没有明显的答案,我愿意考虑它。

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


如果服务器使用一个线程来处理每条消息,您可能需要检查服务器处理每条消息的时间是否不超过5毫秒。如果服务器使用多线程来处理消息,并且处理需要一些时间,即使需要1毫秒,您可能会遇到这样的情况:在某个时候,所有线程都在争夺资源,并且它们没有及时完成以读取下一条消息。对于您描述的问题,我敢打赌服务器是多线程的,而您有这个问题。我不能保证100%的信息虽然缺乏。但在任何情况下,您都需要检查处理消息所需的时间,因为您可能正在处理实时需求。

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


如果服务器使用一个线程来处理每条消息,您可能需要检查服务器处理每条消息的时间是否不超过5毫秒。如果服务器使用多线程来处理消息,并且处理需要一些时间,即使需要1毫秒,您可能会遇到这样的情况:在某个时候,所有线程都在争夺资源,并且它们没有及时完成以读取下一条消息。对于您描述的问题,我敢打赌服务器是多线程的,而您有这个问题。我不能保证100%的信息虽然缺乏。但在任何情况下,您都需要检查处理消息所需的时间,因为您可能正在处理实时需求。

我将测量值间隔为每1000个数据包中有1个,现在它自己就开始工作了。我每5毫秒使用一次printf,这肯定最终完全填满了printf-tx队列。随后,执行延迟了300毫秒。一旦printf屏住呼吸,这个程序就有了一个充满传入数据包的队列,因此似乎每20秒就接收一次数据包

我将测量值间隔为每1000个数据包中有1个数据包,现在它的行为正常了。我每5毫秒使用一次printf,这肯定最终完全填满了printf-tx队列。随后,执行延迟了300毫秒。一旦printf屏住呼吸,这个程序就有了一个充满传入数据包的队列,因此似乎每20秒就接收一次数据包

所有的包裹都收到了吗?我想是的。我明天可以验证。你如何测量20秒的延迟?是否有任何请求响应?你们有原子钟吗?数据报的大小是多少?@EJP:我肯定它们在5ms发送阶段,我很确定在20us发送阶段丢弃了一些,但不是很多。@rodolk:我使用clock_gettime(clock_REALTIME,timespec)在timespec中填充ns成员,然后将该timespec与以前的timespec进行比较。每当recvfrom()返回时,我就会更新新的timespec(recvfrom没有阻塞)。atm没有响应请求。我不认为我在使用原子钟;但是我怎么检查呢?感兴趣的数据是90字节,需要每5毫秒发送一次,但我发送了94字节。所有的数据包都被接收了吗?我想是的。我明天可以验证。你如何测量20秒的延迟?是否有任何请求响应?你们有原子钟吗?数据报的大小是多少?@EJP:我肯定它们在5ms发送阶段,我很确定在20us发送阶段丢弃了一些,但不是很多。@rodolk:我使用clock_gettime(clock_REALTIME,timespec)在timespec中填充ns成员,然后将该timespec与以前的timespec进行比较。每当recvfrom()返回时,我就会更新新的timespec(recvfrom没有阻塞)。atm没有响应请求。我不认为我在使用原子钟;但是我怎么检查呢?感兴趣的数据是90字节,需要每5毫秒发送一次,但我正在发送94字节。很抱歉没有提供更多信息。程序中只有两个线程,而另一个线程(另一个udp服务器)没有收到任何数据。另外,我感兴趣的线程所做的“处理”在测量时被注释掉了。我为没有提供更多信息而道歉。程序中只有两个线程,而另一个线程(另一个udp服务器)没有收到任何数据。此外,在进行测量时,我感兴趣的线程所做的“处理”也被注释掉了。