背景
我正在编写一个应用程序,它要求我通过网络接口流式传输数据,并以非常高的吞吐量将其写入磁盘。网络和文件IO组件是单独实现的,两者都能够独立实现项目所需的吞吐量。网络端利用DPDK
(更相关),文件IO端利用io_uring
(不太相关)。为了实现我所需要的高文件IO吞吐量,我必须使用直接IO(O_DIRECT);无论用于实现文件IO的技术如何,这都是真实的。使用页面缓存不是一个简单的选择。应用程序必须从NIC零拷贝到我们用于存储的NVMes。
问题
我无法对齐DPDK消息缓冲区(rte_mbuf
)以启用直接IO。这严重限制了我的文件IO吞吐量,如果这是不可能的,我可能需要找到DPDK的替代品,当然,这是我想避免的。**有人知道如何实现这种内存对齐吗?**消息缓冲区应与4096的倍数地址对齐。
代码片段
有许多方法可以设置DPDK内存池(rte_mempoool
)和消息缓冲区。现在,我使用的是rte_pktmbuf_pool_create()
(如下所示),它创建一个内存池,并通过一个函数调用分配消息缓冲区,但如果它有助于我获得所需的对齐,我愿意采用不同的方法。
初始化mempool
rte_pktmbuf_pool_create(name, num_bufs, DPDK_MBUF_CACHE_SIZE, 0, mbuf_size, cpu_socket);
在哪里...
DPDK_MBUF_CACHE_SIZE
由硬件决定,设置为315mbuf_size
为9000 + RTE_PKTMBUF_HEADROOM(由DPDK定义为128)+ RTE_ETHER_HDR_LEN + RTE_ETHER_CRC_LEN
1条答案
按热度按时间agxfikkp1#
请参阅下面的代码片段,它们提供了一个解决方案。在你的项目中尝试实现类似的东西之前,一定要从头到尾读一遍。此外,请注意,为了简洁起见,所有关键错误处理都已删除,并且应重新添加到任何类似的实现中。
register_external_buffers()
在巨大的页面中分配外部存储器区域,并将它们注册到DPDK
中。然后
register_external_buffers
可以如下使用:虽然这确实会导致所有mbuf数据都在外部内存区域中存储和对齐,但它们会对齐到巨大的页面--而不是典型的4k页面。这意味着,虽然最初的问题得到了解决,但由于页面边界的数量非常有限,因此该解决方案对于该用例来说并不是非常实用。