我有一个使用dpdk内存池的Linux应用程序。我试图分配一个内存池与24字节的8000000对象。当在内存池创建中没有MEMPOOL_F_NO_CACHE_ALIGN
的情况下运行时,它分配了1688 MB的内存,大约是所需数量的10倍。当我添加MEMPOOL_F_NO_CACHE_ALIGN
时,它减少到512 MB,这也是需要的两倍。我该如何减少呢?
答案 0 :(得分:1)
很遗憾,您无能为力。每个内存池对象都有一个标头,该标头具有指向以下内容的指针:
请参阅: http://doc.dpdk.org/api/structrte__mempool__objhdr.html
Plus内部存储池存储一个循环缓冲区,这大约是每个对象的另一个指针。因此,每个对象的开销远远大于您要存储在每个对象中的数据。
如果我们不在乎物理地址等,而我们所需要的只是能够快速高效地存储这24个字节,那么我们就只使用带有平面数组的循环缓冲区(rte_ring)小物件。在这种情况下,每个对象的开销约为8个字节。
由于内存池实现了内部的每核高速缓存,因此性能会降低。
如果数量仍然过多,则应研究其他非DPDK数据结构。
或存储桶的对象。假设每个存储桶100个对象将使开销实际降低约100倍。