如何处理3.2亿个272字节的UDP报文



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

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

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

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

Linux支持mmap数据包接收。

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

最新更新