---
title: Mbuf多内存
description: "Mbuf是一种共享内存，包含了MbufHead和MbufData两部分数据，如表1所示。"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/others/dataflowdevg/dfdevp_23_0032.html
sourcePath: /source/zh/canncommercial/900/others/dataflowdevg/dfdevp_23_0032.html
indexId: 0c1642c009fb613c05eaaf0af307ba023df5c2d595e40f72d51282d64d13d49969
---
# Mbuf多内存

#### 功能介绍

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


**表1 Mbuf介绍**

| 数据类型 | 描述 |
| --- | --- |
| MbufHead | 即数据头，包含了以下几类数据： 基础的数据内容：比如DataType/DataSize/Shape等信息。 数据传递涉及的关键信息：retCode/routeLabel等框架相关信息。 其他用户可配置字段：starttime/endtime/userdata等。 |
| MbufData | 一段Mbuf上的内存，存储了实际上有效的数据内容。 |


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

```
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+。

3. 在time3的时间点上，内存池1中可用连续内存为9GB+，申请5GB的内存成功。

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


**表2 配置示例**

| 示例名 | 示例描述 | 示例代码 |
| --- | --- | --- |
| 示例一 | 申请一个内存池，大小为10GB，申请内存大小不限制。 | {"ge.flowGraphMemMaxSize", "10737418240"} |
| 示例二 | 申请两个内存池。 内存池1大小为10GB，申请内存大小不限制。 内存池2大小为2GB，最大可以申请2MB。 申请内存<=2MB时会优先在内存池2中申请，申请内存>2MB时只能在内存池1中申请。 | {"ge.flowGraphMemMaxSize", "10737418240,2147483648:2097152"} |
| 示例三 | 申请三个内存池。 内存池1大小为10GB，申请内存大小不限制。 内存池2大小为2GB，最大可以申请20MB。 内存池3大小为1GB，最大可以申请2MB。 申请内存时会根据申请内存大小优先匹配对应的内存池，比如申请内存<=2MB时会优先在内存池3中申请，2MB<申请内存<=20MB的优先在内存池2中申请，申请内存>20MB的只能在内存池3中申请。 | {"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，表示不限制。
