C dpdk mempool分配的方式超出了需要
我有一个linux应用程序,它使用dpdk内存池。我正在尝试分配一个内存池,其中包含8000000个24字节的对象。在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兆字节,这也是需要的两倍多。我怎样才能减少这种情况呢?不幸的是,你无能为力。每个内存池对象都有一个标头,其中包含指向以
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倍