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

标签 linux udp recv zero-copy

因此,我有一个传入的 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 中支持 mmap 数据包接收。

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

参见this了解更多信息。

关于linux - 如何应对3.2亿个272字节的UDP数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16295041/

相关文章:

udp - Docker UDP端口支持?

java - Android - 同步线程与onSensorChanged发送udp数据包

c++ - poll() 不标记可读数据

linux - 无法访问 Kaa 沙盒 SSH

Python scandir() 排序\POSIX readdir 排序

linux - 如何在 bash 中按文件扩展名和大小对目录进行排序

windows - 使用临时端口的 Boost::asio UDP 广播

sockets - D 中的 MSG_WAITALL 标志

c++ - 选择套接字会弄乱数据

xml_grep 从元素中获取属性