dpdk内存池分配的方式超出了必要

时间:2019-06-19 12:39:15

标签: c linux dpdk

我有一个使用dpdk内存池的Linux应用程序。我试图分配一个内存池与24字节的8000000对象。当在内存池创建中没有MEMPOOL_F_NO_CACHE_ALIGN的情况下运行时,它分配了1688 MB的内存,大约是所需数量的10倍。当我添加MEMPOOL_F_NO_CACHE_ALIGN时,它减少到512 MB,这也是需要的两倍。我该如何减少呢?

1 个答案:

答案 0 :(得分:1)

很遗憾,您无能为力。每个内存池对象都有一个标头,该标头具有指向以下内容的指针:

  1. 下一个对象。
  2. 对象所属的内存池。
  3. IO /物理地址。

请参阅: http://doc.dpdk.org/api/structrte__mempool__objhdr.html

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

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

由于内存池实现了内部的每核高速缓存,因此性能会降低。

如果数量仍然过多,则应研究其他非DPDK数据结构。

或存储桶的对象。假设每个存储桶100个对象将使开销实际降低约100倍。