海思MPP业务MMZ内存优化介绍

11 篇文章 0 订阅

海思MPP务MMZ存优化介绍

概述

       完全是本着内存吃紧的情况下的一些优化点,都是在文档有介绍的,自己多调试下就出来了,好不好用,还请自己评估,这里只是给出一些点的介绍。本着有坑也不填的原则,这里只做交流使用,后果自负。

OS内存和MMZ

海思的安防平台芯片的内存主要划分两部分来管理,一部分是系统使用的OS存,一部分是称为MMZ内存,具体这两部分如何配置和使用的,文档中已有相当清析的描述了,这里主要介绍一下海思MPP务里MMZ何节省内存的一般基本方法。

当然,如果你的内存足够富足,基本按海思给的sample配置方式就好了,但一些内存比较紧的时候,还是可以做一些工作来优化节省出一定的内存的。

调试的工具

在介绍前,先了解下海思MPP一些调试工具,主要还是依赖 /proc的一些信息来优化。

Mpp日记 /dev/logmpp

这个文件里的日记信息,相当重要,在开发海思平台的MPP务时,是否有错误,有不合理的地方,都有可能这里发现,如果你不会使用这个信息,说明你还真没太了解MPP务里的东西。

这个文件会打印当前SDK MPP的一些当前运行信息,这个是有个级别可以调试的,如果你想看更详细的信息就把打印的级别调低点,默认会打印警告和错误信,我们在调试内存时就有可能你把内存调得过低了,MPP错时,最直接的表现即在这里。

MMZ内存分配 /proc/media-mem

这里记录了当前MMZ存被分配至哪些模块,被谁使用了。

/proc/umap/*

各个模块的调试信息,当然也包括内存的一些使用情况。

以上这些信息,在他的SDK文档中都有提及介绍了,详细的还是需要细细读一下他的文档。

现在新出的SDK海思也给出了一个XLS文档来配置MMZ一些使用情况,可以参考他的各个模块的内存使用进行优化。

VB存分配

在海思的MPP里,有一个VB理内存池的概念,也就是先根据自己各个模块需要的内存,预先分配好一定的内存,各个模块用时从这个池中去取,像他文档里的这个图说的:

 

可以为各个模块分配不同的VB存块。

以为VI配内存为例,一般一个VI道占用2VB,如果你的一个VI的图像通道大小是1080P那有几个VI道的图像进来,就对应的分配相应的VB

如果使用的VB大小不同,那就尽量分配不同大小的VB块,MPP从分配的数组里,从小到大的找到一个合适的内存块使用。

如何确认你分配的内存块数量是否足够?

/proc/umap/vb

如以下信息:


IsComm1时表示是你自己分配的VB存池,blkcnt分配的数量,Free表示当前空闲的个数,MinFree示历史中最小的空闲个数,如果Free于0表示当前使用的是够的,如果MinFree于0表示一直有内存块是空闲的。

如何分最少的内存块,不浪费,又不影响业务呢?

还是看MinFree,调小VB内存块分配,当MinFree0,并且/dev/logmpp里一直没有报使用这个大小VB的模块的错误,那么就是合适的,内存块也就没有浪费了。

如何合理分配内存块大小

内存块分配合理了,就看内存块的大小分配是否是合理的,如上面的BlkSz663552这个值,一般大家都会使用SDK的sample那个宏公式来计算,都是计算的有富足,多余的, 一般见到的都是视频业务处理中图像的宽,高,进行一个对齐操作,再乘以2。如果你的内存很紧张,那么就试着不是乘以2,比如乘 3/4,或1/2如果分配的内存块小了,而又无法从其它的池中获取内存,/dev/logmpp般会报这个模块需要的内存大小,那么,你可以直把分配他报的这个内存大小去配置这个VB,MPP有个内存对齐,有可能实际分配的还是会比你指定的大小大一点。

VB配就是一个是块的数量,块的大小,不同模块需要不同大小的块时,分别为其分配不同的VB小的块池,这样一般就不会有什么内存在这上面浪费了。

 

 

下面还是以业务的方式来介绍一下MMZ存使用的一些可以优化的方法。

各个模块使用内存块的大小及数量

每个模块使用的内存块的数量,及大小在不同的芯片上有一些小的差异,建议还是参考海思给出的MPP中模块内存计算的那个XLS档。

在查看VB时,如果一些模块占着VB块一直不放,你分配再多的内存都没用,那就要考虑一下是不是性能不够了,在性能不够的情况下,一些模块会一直占着内存块不能释放。

DVR

MPP里基本的视频流 VI->VPSS->VENC/VO, VDEC->VO

多年没有搞DVR品了,主要MPP两个业务一个是录相,预览,视频的回放。

VPSS

VPSS通道一般可以预先创建放在那里,也不会占用太多的内存,一般我是把业务需要的VPSS立好不释放。

DieMode模式的使用,数字视频一般就关了,不使用

有一个backup属可以关注一下,这个可以节省不少内存,但副作用也是相当明显的啦!

还有各个通道的功能使用,不过之前内存收益也不太明显,看最近新出的SDK有一些新添加进来的功能,没有去试过了。

VENC

VENC是个内存大户啊,先确认你使用VENC的内存分配方式,后端的芯片一般都是三种,也就是文档中说的:编码帧存方式

这里以Hi3521A例,支持两种方式,一种是privateVB,种是UserVB具体的内存计算方式见文档,这里如查为了节省内存,就用UserVB方式了。

编码重构帧复用参考帧亮度内存模式,也是一个直接内存节省收益的配置。

码流Buff配置:这个有两种方式,一般模式和省内存方式,副作用也比较高啊,自己评估,如果内存紧张,也是一个有效的内存节省收益的配置。

VECN的通道创建起来就是需要占用比较大的内存的,一般通道动态的创建,不过DVR一般都是实时在录相,所以这个一般情况下都是一直创建的。

VO

输出这一个,一个FB配置上根据自己最大的分辨率指定合适的内存大小,把不用的FB出的内存配置去掉(load脚本里).

再一个就是VO出的一些缓存配置,如HI_MPI_VO_SetDispBufLen使用等。

VDEC

VDEC也很占内存,在DVR一般按需创建VDEC不用进就把他销毁掉吧,放在那也是很占内存的。

VENC样有一个编码帧存方式和码流Buff配置,如果是回放自身的录相还好吧,VENC应的配置对应的节省内存配置也无太多的问题。

另一个注意就是在创建通道时,回放多大的录相视频,就创建对应大小的VDEC通道,别创建一个能回放所有视频大小的通道,如果这样做也是很费内存的。

另一个是回放方式的选择上,在回放时,如果性能不够的情况下,内存有可能也被一直占着不释放,你可以使用预览模式试试,这个副作用就是会丢帧啊!

NVR

NVR产品基本同DVR方式的优化方法类似。最多的也是VDEC,VENC上下做功夫,不重复讲了。

IPC

IPC产品这里以3518EV200例来说一些,因为这家伙只有64MB内存,看过一些人做的产品内存上还是非常吃紧的。

这里以1080P@20fps + VGA@25fps例说明,MMZ内存使用上大概在22MB样子。

1VI->VPSS使用在线模式,这样能节不少内存,只是ISP的一些功能用不了了,不过3518E图像还是在VPSS做一些优化吧。

2:VPSS启lowdelay把VPSSVPSS个通道,一个是1080P主码流,一个是VGA子码流,把主码流的通道同VENC编码主通道绑定在一起。

2:VENC开启H264eMiniBufMode,JpegeMiniBufMod,H264eRcnEqualRef开启,根据这些配置,计算编码的内存大小。

基本也就是上面这些点吧,最重要的两个方面的优化,一个是VB的使用上,DVRVENCNVRVDECIPCVENC这些文档如都有提及的。同时注内占用MMZ块内存的地方,看是否有合适的方式修改。

最主要的还是查看/proc/umap的运行信息,查看各个模块的VB内存使用情况,是否有报错等。

同样调试完内存,还是得查看/proc/umap的信息是否正常,如VI的VB申请情况,是否有失败的问题,h264e是否有丢失图像,掉帧。

  • 12
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值