请帮忙!我有一个应用程序需要尽可能接近实时处理,我不断遇到TCP和UDP这个不寻常的延迟问题。延迟发生像发条一样,并且始终是相同的时间长度(大多数是15到16毫秒)。它发送到任何机器(本地前夕)和任何网络(我们有两台)时都会发生。

快速解决问题:

我总是在使用VS ++ Pro编译的C ++中使用winsock,但是我已经编写了几个使用TCP和UDP以各种方式发送和接收的程序。我总是使用以各种语言(MATLAB,C#,C ++)编写的中间程序(本地或远程运行)将信息从一个程序转发到另一个程序。两个winsock程序都在同一台机器上运行,因此它们显示来自同一时钟的Tx和Rx的时间戳。我一直看到一个模式出现的地方,一阵数据包将被传输,然后在下一次突发之前有大约15到16毫秒的延迟,尽管没有编程延迟。有时它可能在每个数据包之间15到16毫秒而不是一阵包。其他时间(很少)我会有不同的长度延迟,例如~47 ms。我似乎总是在一毫秒内收到数据包,但传输的突发之间会出现相同的延迟模式。

我怀疑winsock或NIC在每次传输之前都在缓冲数据包但我没有找到任何证据。我有一个千兆连接到一个网络,可以获得不同级别的流量,但是在具有没有流量(至少来自用户)和2千兆位连接的专用网络的群集上运行中间程序时,我也会遇到同样的问题。在使用发送和接收程序在本地运行中间程序时,我甚至会遇到这种延迟。

有帮助吗?

解决方案

我在今天早上用Java重写服务器时发现了问题。我的Windows系统时钟的分辨率在15到16毫秒之间。这意味着显示与其传输时间相同毫秒的每个数据包实际上是以16毫秒的间隔在不同的毫秒发送,但我的时间戳仅每15到16毫秒递增一次,因此它们看起来是相同的。

我来到这里回答我的问题,我看到了关于提高我的计划优先级的回应。所以我启动了所有三个程序,进入任务管理器,将所有三个程序提升为“实时”程序。优先级(没有其他进程在)并运行它们。我得到了相同的15到16毫秒的间隔。

感谢您的回复。

其他提示

总是涉及缓冲,它在硬件/驱动程序/操作系统等之间有所不同。数据包调度程序也起着重要作用。

如果你想要“硬实时”保证,你可能应该远离Windows ...

您可能看到的是调度程序延迟 - 您的应用程序正在等待其他进程完成其时间片并放弃CPU。多处理器Windows上的标准时间片为15ms到180ms。

您可以尝试提高应用程序/线程的优先级。

是的,我知道你的意思。 Windows及其缓冲区...尝试调整发送方SO_SNDBUF和接收方SO_RCVBUF的值。此外,检查涉及的网络硬件(路由器,交换机,媒体网关) - 在机器之间尽可能多地消除,以避免延迟。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top