Mbuf是一种共享内存,包含了MbufHead和MbufData两部分数据,如表1所示。
数据类型 |
描述 |
---|---|
MbufHead |
即数据头,包含了以下几类数据:
|
MbufData |
一段Mbuf上的内存,存储了实际上有效的数据内容。 |
在DataFlow的内存分配场景中,Mbuf是驱动对于内存管理的统一机制,所有的FlowMsg都会在Mbuf池中进行生成并使用。每个FlowMsg都会申请一段Mbuf内存:
1 2 3 |
sizeMbuf = sizeof(MbufData) // FlowMsg实际包含的内存大小 + sizeof(MbufHead) // mbufHead大小,实际为1024B |
用户存在大量UDF进程,且每个UDF进程都可能申请大量小内存的场景下,建议使用Mbuf多内存池。如下举例说明。
假设Mbuf内存池总大小是10GB,不使用Mbuf多内存池时,由于内存碎片的存在,无法申请连续的大块内存。详细信息如下。
针对上述场景,需要额外新增内存池配置,用以处理内存碎片问题。主要方法是,将Mbuf设置为可配置多内存池系统,小内存放入专用小内存池中。
Mbuf多内存池示例图如下。
该方案是通过配置“ge.flowGraphMemMaxSize”实现的,配置示例如表2中的示例二。
示例名 |
示例描述 |
示例代码 |
||
---|---|---|---|---|
示例一 |
申请一个内存池,大小为10GB,申请内存大小不限制。 |
|
||
示例二 |
申请两个内存池。
申请内存<=2MB时会优先在内存池2中申请,申请内存>2MB时只能在内存池1中申请。 |
|
||
示例三 |
申请三个内存池。
申请内存时会根据申请内存大小优先匹配对应的内存池,比如申请内存<=2MB时会优先在内存池3中申请,2MB<申请内存<=20MB的优先在内存池2中申请,申请内存>20MB的只能在内存池3中申请。 |
|
ge.flowGraphMemMaxSize具体含义如下。
FlowGraph场景下,网络可使用的内存配置,可根据网络大小指定。单位:Byte,可以支持多个内存池配置,最多支持128个内存池,配置格式为"内存池1大小:申请内存限制,内存池2大小:内存申请限制,...,内存池n大小:内存申请限制", 如果不设置,默认单个内存池,大小10GB,申请内存大小不限制。
内存池大小取值范围为[1024, 274877906944],单位为Byte,所有内存池大小加起来不能超过256GB,实际使用时受硬件限制。
申请内存限制取值范围为0或者[1024,2147483648],单位为Byte,为可选配置,默认为0,表示不限制。