如何应对3.2亿个272字节的UDP数据包?

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

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

所以我想知道是否有可能为我的应用程序(mmap样式)处理内核的UDP数据缓冲区,或者使用某种从内核到用户空间的零拷贝? 或者,你是否知道有其他方法可以减less这种开销并能够执行所需的处理?

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

在Linux中支持mmap数据包接收。

使用UDP套接字并不是那么容易,因为您将接收来自RAW套接字的数据包。

看到这个更多的信息。