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