dpdk mempool 分配的方式超出了必要

dpdk mempool allocates way more than necessary

我有一个使用 dpdk 内存池的 linux 应用程序。我正在尝试分配一个内存池,其中包含 8000000 个 24 字节的对象。当 运行 没有 MEMPOOL_F_NO_CACHE_ALIGN 在 mempool 创建中它分配了 1688 兆字节的 eal 内存,大约是必要的 10 倍。当我添加 MEMPOOL_F_NO_CACHE_ALIGN 时,它减少到 512 兆字节,这也是必要的两倍多。我怎样才能减少这个?

不幸的是,您无能为力。每个内存池 object 都有一个 header,它指向:

  1. 下一个 object。
  2. object 所属的内存池。
  3. IO/physical地址。

见: http://doc.dpdk.org/api/structrte__mempool__objhdr.html

Plus 内部内存池存储一个循环缓冲区,大致是每个 object 的另一个指针。因此,per-object 开销比您尝试在每个 object.

中存储的数据要多得多

如果我们不关心物理地址等,我们所需要的只是能够快速高效地存储这 24 个字节,我们几乎可以只使用循环缓冲区 (rte_ring)小 object 的平面数组。在这种情况下,每个 object 的开销约为 8 个字节。

性能会降低,因为内存池实现了内部 per-core 缓存。

如果还是太多,你应该看看其他non-DPDK数据结构。

或者存储 object 的桶。比如说,每个桶 100 objects 将使开销有效降低约 100 倍。