因此,我有一个传入的 UDP 流,由 272 字节数据包组成,数据速率约为 5.12Gb/s(每秒大约 320e6 个数据包)。该数据由基于 FPGA 的定制板发送。数据包大小是正在运行的数字设计的限制,因此虽然理论上可以增加数据包以使事情变得更高效,但这需要大量的工作。在接收端,这些数据包由网络线程读取和解释,并放置在与缓冲线程共享的循环缓冲区中,缓冲线程会将这些数据复制到 GPU 进行处理。
接收端的上述设置可以使用简单的 recv
调用来处理 5.12Gb/s 的 4096 KB 数据包(用于不同的设计),但是根据我当前的数据包大小很难跟上数据包流,太多的时间被“浪费”在上下文切换和将小数据段从内核空间复制到用户空间上。我使用 recvmmsg
进行了快速测试实现,但是情况并没有太大改善。平均而言,我可以处理大约 40% 的传入数据包。
所以我想知道是否可以为我的应用程序获取内核的 UDP 数据缓冲区的句柄(mmap 样式),或者使用某种从内核到用户空间的零复制? 或者,您是否知道任何其他方法可以减少这种开销并能够执行所需的处理?
它使用 C 代码在 Linux 计算机(内核 3.2.0-40)上运行。
最佳答案
关于linux - 如何应对3.2亿个272字节的UDP数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16295041/