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

标签 c linux dpdk

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

最佳答案

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

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

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

Plus内部内存池存储了一个循环缓冲区,大致就是每个对象的另一个指针。因此,每个对象的开销远远超过您尝试在每个对象中存储的数据。

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

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

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

或存储对象桶。比如说,每个桶 100 个对象将使开销有效降低约 100 倍。

关于c - dpdk mempool 分配的方式超出了必要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56667858/

相关文章:

c - isalpha() 和 isdigit() 总是返回 0

c - 调用sigaction()时sa_sigaction设置为NULL是什么意思?

docker - 在 Linux Alpine 上安装 DPDK 时出错

c - 使用 Keil uVision 的 8051 C 中断处理

c - 外部变量声明和定义

c - 海湾合作委员会错误 : Invalid operands to binary +

linux - 什么会破坏/proc/self/exe?

linux - switch_console.c :1053 We've become an orphan, 不再有控制台供我们使用

c - 从 Rust FFI 访问 DPDK 中的静态 C 函数

linux - 我们可以在 OpenWrt linux 操作系统上运行 DPDK 应用程序吗?