Mbuf多内存

功能介绍

Mbuf是一种共享内存,包含了MbufHead和MbufData两部分数据,如表1所示。

表1 Mbuf介绍

数据类型

描述

MbufHead

即数据头,包含了以下几类数据:

  • 基础的数据内容:比如DataType/DataSize/Shape等信息。
  • 数据传递涉及的关键信息:retCode/routeLabel等框架相关信息。
  • 其他用户可配置字段:starttime/endtime/userdata等。

MbufData

一段Mbuf上的内存,存储了实际上有效的数据内容。

DataFlow的内存分配场景中,Mbuf是驱动对于内存管理的统一机制,所有的FlowMsg都会在Mbuf池中进行生成并使用。每个FlowMsg都会申请一段Mbuf内存:

1
2
3
sizeMbuf  = 
       sizeof(MbufData) // FlowMsg实际包含的内存大小
     + sizeof(MbufHead) // mbufHead大小,实际为1024B

FlowMsg是FlowGraph上节点间传递信息的载体,用于处理FlowFunc输入输出的相关操作。FlowMsg使用共享内存Mbuf来保存信息。详细信息请参考简介

背景信息

用户存在大量UDF进程,且每个UDF进程都可能申请大量小内存的场景下,建议使用Mbuf多内存池。如下举例说明。

假设Mbuf内存池总大小是10GB,不使用Mbuf多内存池时,由于内存碎片的存在,无法申请连续的大块内存。详细信息如下。

  1. 在time1的时间点,申请了多个大块内存(3GB)和多个小块内存(2MB)。
  2. 在time2的时间点上,大内存不再使用,释放给内存池变为空闲状态。此时,从内存池整体状况来看,整体内存使用情况是:3GB(空闲)+2MB(已申请)+3GB(空闲)+2MB(已申请)+3GB(空闲)+2MB(已申请),可用内存为9GB+。
  3. 在time3的时间点上,虽然可用内存为9GB+,但是由于内存碎片(2MB内存块)的存在,所以申请5GB的连续内存失败。

使用示例

针对上述场景,需要额外新增内存池配置,用以处理内存碎片问题。主要方法是,将Mbuf设置为可配置多内存池系统,小内存放入专用小内存池中。

Mbuf多内存池示例图如下。

  1. 在time1的时间点,申请了多个大块内存(3GB)和多个小块内存(2MB)。
  2. 在time2的时间点上,大内存不再使用,释放给内存池变为空闲状态。此时,从内存池整体状况来看,整体内存使用情况是:3GB(空闲)+3GB(空闲)+3GB(空闲)+2MB(已申请)+2MB(已申请),内存池1中可用内存为9GB+, 内存池2中可用内存为1G+。
  1. 在time3的时间点上,内存池1中可用连续内存为9GB+,申请5GB的内存成功。

该方案是通过配置“ge.flowGraphMemMaxSize”实现的,配置示例如表2中的示例二。

表2 配置示例

示例名

示例描述

示例代码

示例一

申请一个内存池,大小为10GB,申请内存大小不限制。

1
{"ge.flowGraphMemMaxSize", "10737418240"} 

示例二

申请两个内存池。

  • 内存池1大小为10GB,申请内存大小不限制。
  • 内存池2大小为2GB,最大可以申请2MB。

申请内存<=2MB时会优先在内存池2中申请,申请内存>2MB时只能在内存池1中申请。

1
{"ge.flowGraphMemMaxSize", "10737418240,2147483648:2097152"} 

示例三

申请三个内存池。

  • 内存池1大小为10GB,申请内存大小不限制。
  • 内存池2大小为2GB,最大可以申请20MB。
  • 内存池3大小为1GB,最大可以申请2MB。

申请内存时会根据申请内存大小优先匹配对应的内存池,比如申请内存<=2MB时会优先在内存池3中申请,2MB<申请内存<=20MB的优先在内存池2中申请,申请内存>20MB的只能在内存池3中申请。

1
{"ge.flowGraphMemMaxSize", "10737418240,2147483648:20971520,1073741824:2097152"} 

ge.flowGraphMemMaxSize具体含义如下

FlowGraph场景下,网络可使用的内存配置,可根据网络大小指定。单位:Byte,可以支持多个内存池配置,最多支持128个内存池,配置格式为"内存池1大小:申请内存限制,内存池2大小:内存申请限制,...,内存池n大小:内存申请限制", 如果不设置,默认单个内存池,大小10GB,申请内存大小不限制。

内存池大小取值范围为[1024, 274877906944],单位为Byte,所有内存池大小加起来不能超过256GB,实际使用时受硬件限制。

申请内存限制取值范围为0或者[1024,2147483648],单位为Byte,为可选配置,默认为0,表示不限制。