C dpdk mempool分配的方式超出了需要

C dpdk mempool分配的方式超出了需要,c,linux,dpdk,C,Linux,Dpdk,我有一个linux应用程序,它使用dpdk内存池。我正在尝试分配一个内存池,其中包含8000000个24字节的对象。在MEMPOOL创建过程中,在没有MEMPOOL\u F\u NO\u CACHE\u ALIGN的情况下运行时,它分配了1688兆字节的eal内存,大约是所需内存的10倍。当我添加MEMPOOL\u F\u NO\u CACHE\u ALIGN时,它被减少到512兆字节,这也是需要的两倍多。我怎样才能减少这种情况呢?不幸的是,你无能为力。每个内存池对象都有一个标头,其中包含指向以

我有一个linux应用程序,它使用dpdk内存池。我正在尝试分配一个内存池,其中包含8000000个24字节的对象。在MEMPOOL创建过程中,在没有
MEMPOOL\u F\u NO\u CACHE\u ALIGN的情况下运行时,它分配了1688兆字节的eal内存,大约是所需内存的10倍。当我添加
MEMPOOL\u F\u NO\u CACHE\u ALIGN
时,它被减少到512兆字节,这也是需要的两倍多。我怎样才能减少这种情况呢?

不幸的是,你无能为力。每个内存池对象都有一个标头,其中包含指向以下各项的指针:

  • 下一个目标
  • 对象所属的内存池
  • IO/物理地址
  • 见:

    另外,内存池内部存储一个循环缓冲区,大约是每个对象的另一个指针。因此,每个对象的开销远远大于您试图存储在每个对象中的数据

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

    性能会更低,因为内存池实现了内部每核心缓存

    如果仍然太多,您应该研究其他非DPDK数据结构

    或者存储一桶桶的对象。也就是说,每桶100个对象将使开销有效降低约100倍