内核何时将 UDP 数据报切割成 MTU 块?

内核何时将 UDP 数据报切割成 MTU 块?

我需要您对我遇到的问题提供帮助/提示/评论。谢谢

以下是一些上下文:我有两个应用程序(A1 和 A2)处理最大大小为 1700 字节的 PDU。每个应用程序位于不同的卡(C1 和 C2)上,使用 1Gbps 以太网直接相互连接,并且两个应用程序都使用 UDP 套接字发送和接收。卡 C2 比 C1、A1 和 A2 更强大。

尽管 PDU 的长度可达 1700 字节,但当每个应用程序发送和接收 PDU 时,它们永远不会大于 1450 字节。因此,对于 1500 字节的典型 MTU,PDU 和以太网帧之间存在 1 对 1 的映射。

除了最高的数据速率(~125Mbps FYI)外,在各种数据速率下一切都工作正常,其中功能最弱的卡 C1 在大约 90Mbps 时达到 100% CPU 使用率。

我开始通过研究网络通信来研究如何提高全局性能。在一切都进入工作状态之前,我决定开始使用连接的 UDP 套接字,因为我读到不知何故,它们通过绕过内核中的几个步骤更快。所以我认为它们更好,因为我从未花时间实现其非连接对应部分。

备注 0:我愿意接受任何争论为什么 UDP 连接套接字更快的回应

然后我开始增加 C1 和 C2 之间的 MTU ==> 没有任何改进,因为我仍然send通过线路发送最大 1450 字节的 PDU。

下一步:PDU 聚合。我没有将 PDU 一个接一个地发送,而是将它们聚合成约 60KB 的大型 UDP 数据报,并通过 MTU 为 1500 的线路发送它们 ==> 没有任何改进(内核在某个时刻剪切了大数据报,以以太网帧结束)另一端没有丢包,所以我的机制一定没问题。

问题 1:出于好奇,内核何时将我的数据切割成更小的(类似 MTU)数据?就在将其发送到 IP 之前?在以太网之前?更低?(所以 NIC 负责它?)

最后一步:在两侧使用较大的 MTU (3000 5000 6000 8192) 发送聚合的 PDU。问题来了。MTU 增加得越多,错误就越多!

问题2:有人经历过吗?两个卡模块预计都支持以太网巨型帧。怎么会这样?关于在哪里看有什么提示吗?

仅供参考,瓶颈卡 C1 运行内核 2.6.23,因此sendmmsg不能选择类似选项。

如需更多信息,我有两套 2 卡。 C2 从流量生成器检索 125Mbps(一次 1 个 PDU),将其发送到 C1(一次 1 个 PDU),C1 在空中发送数据流(一次多个 PDU)。 C1' 在空中捕获数据(不知道如何,这很神奇)(一次多个 PDus,然后将它们发送到 C2'(一次一个,但尝试一次发送多个,因为它不起作用C2' 通过将数据发送回流量生成器来结束循环,流量生成器将其与之前发送的数据进行比较并打印大量详细信息。

谢谢你的时间,

索克斯

相关内容