[DPDK编程手册]5Mempool库

来源:互联网 发布:色诺芬经济金融数据库 编辑:程序博客网 时间:2024/05/22 00:32

    内存池就是一个大小固定的对象的分配器。在DPDK中,内存池用名称进行标识,并且通过使用内存池的处理程序来存储空闲对象。默认情况下,内存池的处理程序是基于环的,并且也提供了一些可选的服务:如核心对象缓存与对齐工具,从而确保将对象通过填充扩展到DDR3或DRAM的所有通道上。

    Mbuf库会使用该库。


1、cookies

    在调试模式下,即CONFIG_RTE_LIBRTE_MEMPOOL_DEBUG被置位的情况下,会在分配块的起始和结束位置添加cookies。在分配的对象中包含覆写保护字段有助于调试缓冲区溢出。

2、统计信息

    在调试模式下,即CONFIG_RTE_LIBRTE_MEMPOOL_DEBUG被置位的情况下,对内存池获取/放置操作的统计信息存储在mempool结构中,且每个逻辑核都有统计信息,以避免并发访问统计计数器。

3、内存对齐约束

    根据硬件内存的配置,在对象之间添加特定的填充能够大幅提升性能。对齐的目的是要确保每个对象的起始位于不同的通道起点,以使所有的通道可以同等的被加载。

    当进行L3转发或者流分类时,对包的缓冲区填充更是如此。由于仅访问前64个字节,因此可以通过在不同的信道之间扩展对象的起始地址来增加性能。


4、内存池处理函数

    允许外部的存储子系统与DPDK一起使用,例如外部硬件存储器管理系统和基于软件的存储器分配器。

内存池处理程序有以下两个方面:

  • 添加新的mempool操作(ops)。这可以通过添加新的mempool 操作代码并使用MEMPOOL_REGISTER_OPS宏来实现。
  • 使用新的API来rte_mempool_create_empty()和rte_mempool_set_ops_byname()来创建一个新的mempool并指定要使用的操作。

    在一个应用程序中可能会使用几个不同的mempool的处理程序。使用rte_mempool_create_empty()函数创建一个新的mempool,然后使用rte_mempool_set_ops_byname()将mempool和相关的mempool处理程序的回调结构关联起来。

    遗留下来的应用程序可能会继续使用旧的rte_mempool_create()API调用,其默认情况下使用基于环的mempool处理程序。则这些应用程序需要进行修改来使用新的mempool处理程序。

    对于使用rte_pktmbuf_create()的应用程序,有一个配置设置,其允许应用程序使用备用的mempool处理程序。

5、实例

所有要求高性能的分配都应该使用基于池的内存分配器。下面是一些例子:

  • Mbuf库
  • EAL中用于登录的服务
  • 任何需要在数据面分大小固定对象并且这些对象在系统中连续使用的应用程序。




     

1 0
原创粉丝点击