首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么当两台安装了Ubuntu22.04的计算机之间有额外的高带宽通信时,延迟和抖动会更少呢?

为什么当两台安装了Ubuntu22.04的计算机之间有额外的高带宽通信时,延迟和抖动会更少呢?
EN

Unix & Linux用户
提问于 2022-08-31 08:27:06
回答 1查看 369关注 0票数 0

我有两台计算机,它们通过以太网电缆连接,上面安装了Ubuntu22.04。我在计算机A上有一个客户机,它将UDP数据包发送到计算机B上的服务器),我正在测量这些数据包在不同情况下的延迟和抖动。我使用套接字库用C语言编写了客户机和服务器的源代码。

当两台计算机之间存在额外的、高带宽的通信量时,在测量延迟的数据包顶部时,抖动和延迟小于在没有额外通信量的情况下发送数据包时:

  • 往返时间无额外交通: 0.556毫秒
  • 往返时间及额外流量: 0.105毫秒
  • 没有额外流量的抖动: 0.042毫秒
  • 附加流量的抖动: 0.014 ms

这似乎很有趣,因为我可以想象更少的数据包意味着更少的延迟和抖动,但结果显示并非如此。谁能告诉我原因是什么吗?我怀疑这与缓冲区优化有关,当更多的数据包到达时,缓冲区必须更频繁地被清空,但我不确定。如果是这样的话,我如何配置缓冲区以尽量减少延迟?

Edit#1:正如建议的那样,我试图修改NIC (ethtool -c)的配置参数:

我只能将rx-usecs 3的初始值改为rx-usecs 1 us.我不能修改适应性-rx和rx低,我不认为他们是支持我的nic。

将rx-usecs值降到1并没有解决这个问题,如果不增加,这两种场景的延迟差异保持不变。

把它增加到5和10,似乎也没有帮助。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 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时间和吞吐量为代价,将合并减少到最低程度是很有趣的。

  • 当然,对于繁忙的polling.来说,这是不需要的。
  • 当然,对于多队列网卡,如果您不首先确保它们的相关IRQ在所有可用核上均匀分布,则效果非常小,
  • 当然,如果您的系统没有运行IRQ线程,则不会产生任何效果,因为IRQ处理的实际工作不会通过遵循实时调度策略的专用内核线程来完成。
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/715594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档