2

因此,我有一个由 272 字节数据包组成的传入 UDP 流,数据速率约为 5.12Gb/s(大约每秒 320e6 个数据包)。该数据由基于 FPGA 的定制板发送。数据包大小是正在运行的数字设计的限制,因此尽管理论上可以增加它以提高效率,但这需要大量的工作。在接收端,这些数据包由网络线程读取和解释,并放置在与缓冲线程共享的循环缓冲区中,该缓冲区会将这些数据复制到 GPU 进行处理。

接收端的上述设置可以使用简单recv的调用处理 5.12Gb/s 的 4096 KB 数据包(用于不同的设计),但是对于当前的数据包大小,我也很难跟上数据包流许多时间被“浪费”在上下文切换和从内核空间复制小数据段到用户空间。我做了一个使用 的快速测试实现recvmmsg,但是事情并没有太大改善。平均而言,我可以处理大约 40% 的传入数据包。

所以我想知道是否可以为我的应用程序(mmap 样式)获取内核的 UDP 数据缓冲区的句柄,或者使用某种从内核到用户空间的零复制?或者,您是否知道任何其他方法可以减少这种开销并能够执行所需的处理?

这是在使用 C 代码的 Linux 机器(内核 3.2.0-40)上运行的。

4

1 回答 1

2

Linux 支持 mmap 数据包接收。

它不像 UDP 套接字那样容易使用,因为您将收到来自 RAW 套接字的数据包。

有关更多信息,请参阅

于 2013-04-30T08:29:24.787 回答