我有两台计算机,它们通过以太网电缆连接,上面安装了Ubuntu22.04。我在计算机A上有一个客户机,它将UDP数据包发送到计算机B上的服务器),我正在测量这些数据包在不同情况下的延迟和抖动。我使用套接字库用C语言编写了客户机和服务器的源代码。
当两台计算机之间存在额外的、高带宽的通信量时,在测量延迟的数据包顶部时,抖动和延迟小于在没有额外通信量的情况下发送数据包时:
这似乎很有趣,因为我可以想象更少的数据包意味着更少的延迟和抖动,但结果显示并非如此。谁能告诉我原因是什么吗?我怀疑这与缓冲区优化有关,当更多的数据包到达时,缓冲区必须更频繁地被清空,但我不确定。如果是这样的话,我如何配置缓冲区以尽量减少延迟?
Edit#1:正如建议的那样,我试图修改NIC (ethtool -c)的配置参数:

我只能将rx-usecs 3的初始值改为rx-usecs 1 us.我不能修改适应性-rx和rx低,我不认为他们是支持我的nic。
将rx-usecs值降到1并没有解决这个问题,如果不增加,这两种场景的延迟差异保持不变。
把它增加到5和10,似乎也没有帮助。
发布于 2022-09-01 18:19:22
如果您想要减少网络延迟和抖动,可以说它总是会增加cpu负载,而在某些情况下,它还会降低重路由下的吞吐量:
A/确定的锤子:繁忙的投票!(大的警告,你得到的cpus越少,你就会牺牲更多的其他东西。)
这样做的想法是,不要忘记一些阻塞的recvmsg,从而释放您的cpu用于其他任务,最终刷新cpu缓存,并最终在几个上下文切换和软处理…之后返回您的任务。你循环进入你的任务忙-等待来自NIC的数据。
一旦数据在缓冲区…中可用它将在没有任何额外延迟的情况下得到处理。
请参考man recvmsg并阅读与MSG_DONTWAIT标志相关的部分。还请注意,打开套接字O_NONBLOCK可以达到类似的效果,同时也要注意,轮询也可以由内核实现,但我个人不喜欢…之后的想法。我只得到两个核心…;-)
尽管如此,您肯定希望将任务固定在一个cpu上,这将防止可能的任务迁移开销,并有助于保持缓存的热度。
这种方法的好处是即时的!将延迟和抖动减少到最小,而不需要花费在…上的吞吐量因为没有免费午餐…最大可能的负荷。
B/低级网卡调优(中断合并、环形缓冲区、传输队列…)通过ethtool)
-缓冲区:一般和任何子系统(网络/声音/…)缓冲器是延迟/抖动的集合。所以你会想把它们降到最低。
严格的最小值是多少?
当您在重载下开始丢失和/或溢出数据包时(如ifconfig所报告)
-中断合并:由于数据包在主机内存中,中断合并会增加数据包到达时间的延迟,但是主机直到稍后才知道数据包的存在。然而,系统将使用较少的CPU周期,因为产生的中断较少,并且主机每个中断处理几个数据包。
因此,在这里以cpu时间和吞吐量为代价,将合并减少到最低程度是很有趣的。
https://unix.stackexchange.com/questions/715594
复制相似问题