Pcupid 内存使用参考
本文介绍了在Pcupid平台上的内存使用参考。
1. 配置内存¶
1.1. 编译时¶
在Pcupid平台上,内存从软件角度被划分为多个区域,本文主要描述MMA Heap 区域和Linux系统内存区域。
-
MMA Heap区域:MI 模块运行时的内存池,MI模块缓存图像数据所用的内存都是从MMA Heap中申请。
-
Linux系统内存:Linux系统运行所需的内存。
在project 目录下执行 make menuconfig
进入配置界面,进入DRAM_LAYOUT
,如下图所示的选项:
其中主要选项的含义是:
-
dram_size
:物理内存的大小; -
LX Memory Size
:Linux系统管理的内存大小; -
MMA Memory Size
:MMA Heap的大小(最大512MByte);
按图中的例子,dram_size 是0x40000000,也就是1G byte,LX Memory Size也是1G byte大小,说明是由Linux 来管理整块物理内存。MMA Memory Size 是0x10000000,就是256M byte,说明是从1G byte的物理内存中划分出一块256M byte的内存作为MMA Heap区域使用,Linux 后续都不会从MMA Heap区域申请内存。
所以在这个例子中,MMA Heap的内存大小为256M byte,Linux系统可用的内存大小为768M byte。
开发者可通过修改这些配置选项,然后执行 make image-fast
重新打包镜像,再重新烧录到芯片即可。
1.2. 运行时¶
若不想重新编译镜像,也可在运行时,通过修改UBOOT 启动参数,达到修改MMA Heap大小的效果。
进入UBOOT之后,修改bootargs 环境变量的值,将mma_heap=mma_heap_name0,miu=0,sz=0x8000000
里sz变量的值修改为0x8000000,即可修改MMA Heap 大小为128M:
setenv bootargs ubi.mtd=ubia,2048 root=/dev/mtdblock5 rootfstype=squashfs ro init=/linuxrc LX_MEM=0x1000000000,0x40000000 mma_heap=mma_heap_name0,miu=0,sz=0x8000000 mma_memblock_remove=1 cma=10M mtdparts=$(mtdparts) nohz=off saveenv reset
2. 内存不足的情况¶
2.1. MMA Heap不足¶
当MMA Heap内存不足时,MI 模块运行时会申请不到足够的内存,会出现以下的log:
[MI ERR] _MI_SYS_Mma_MapVpaToPa [mi_sys][244]: PA Slice count 105 less than require count 158 [MI WRN] MI_SYS_Pass_AllocBufDefaultPolicy [mi_sys][1003]: Can't Find Buf Allocation Error
在开启Sigmastar MMU的情况下,MMA Heap 中的内存是按page为单位来管理的,上面的log表示需要158个Page,但MMA Heap 只有105个空闲的page,导致MI模块无法申请到Buf来存放数据,这时候就需要增加MMA Heap的大小。
2.2. Linux 内存不足¶
当Linux 内存不足时,会出现OOM killer 的错误,将一些进程killer,例如下面的例子,由于Linux内存不足将pipeline 销毁:
<4>preview invoked oom-killer: gfp_mask=0x1100cca(GFP_HIGHUSER_MOVABLE), order=0, oom_score_adj=0 <3>CPU: 0 PID: 812 Comm: preview Tainted: P O 5.10.117 #128 <3>Hardware name: SStar Soc (Flattened Device Tree) <3>[<c00113bd>] (unwind_backtrace) from [<c000ee27>] (show_stack+0xb/0xc) <3>[<c000ee27>] (show_stack) from [<c032a55d>] (dump_stack_lvl+0x61/0x74) <3>[<c032a55d>] (dump_stack_lvl) from [<c0328f0b>] (dump_header+0x37/0x184) <3>[<c0328f0b>] (dump_header) from [<c007f48f>] (oom_kill_process+0x53/0x1b8) <3>[<c007f48f>] (oom_kill_process) from [<c007faf9>] (out_of_memory+0x22d/0x278) <3>[<c007faf9>] (out_of_memory) from [<c009fa1b>] (__alloc_pages_nodemask+0x4c9/0x5e6) <3>[<c009fa1b>] (__alloc_pages_nodemask) from [<c007decd>] (pagecache_get_page+0x91/0xfc) <3>[<c007decd>] (pagecache_get_page) from [<c007e0bf>] (filemap_fault+0x167/0x2c4) <3>[<c007e0bf>] (filemap_fault) from [<c009345f>] (__do_fault+0x27/0x3e) <3>[<c009345f>] (__do_fault) from [<c00945cd>] (handle_mm_fault+0x2bb/0x50a) <3>[<c00945cd>] (handle_mm_fault) from [<c0013c73>] (do_page_fault+0x127/0x19c) <3>[<c0013c73>] (do_page_fault) from [<c0013e43>] (do_PrefetchAbort+0x27/0x58) <3>[<c0013e43>] (do_PrefetchAbort) from [<c000947b>] (__pabt_usr+0x5b/0x5c) <3>Exception stack(0xc1b2bfb0 to 0xc1b2bff8) <3>bfa0: 005e57d0 00537008 005e6f46 005e57d0 <3>bfc0: 004e1000 005e5860 005e58a0 be969798 00000000 00000000 b6f5e000 00000000 <3>bfe0: 00000007 be969798 0019cb43 0019beb6 80000030 ffffffff <3>Mem-Info: <3>active_anon:3 inactive_anon:336 isolated_anon:0 <3> active_file:2 inactive_file:0 isolated_file:0 <3> unevictable:0 dirty:0 writeback:0 <3> slab_reclaimable:235 slab_unreclaimable:2261 <3> mapped:4 shmem:0 pagetables:21 bounce:0 <3> free:794 free_pcp:0 free_cma:177 <3>Node 0 active_anon:12kB inactive_anon:1344kB active_file:8kB inactive_file:0kB unevictable:0kB isolated(anon):0kB isolated(file):0kB mapped:16kB dirty:0kB writeback:0kB shmem:0kB writeback_tmp:0kB kernel_stack:624kB all_unreclaimable? no <3>Normal free:3176kB min:644kB low:804kB high:964kB reserved_highatomic:2048KB active_anon:12kB inactive_anon:1344kB active_file:40kB inactive_file:32kB unevictable:0kB writepending:0kB present:32768kB managed:26084kB mlocked:0kB pagetables:84kB bounce:0kB free_pcp:0kB local_pcp:0kB free_cma:708kB <3>lowmem_reserve[]: 0 0 0 <3>Normal: 52*4kB (UMCH) 33*8kB (UMH) 20*16kB (M) 15*32kB (M) 11*64kB (MC) 8*128kB (MC) 1*256kB (M) 0*512kB 0*1024kB 0*2048kB = 3256kB <3>3 total pagecache pages <3>8192 pages RAM <3>0 pages HighMem/MovableOnly <3>1671 pages reserved <3>512 pages cma reserved <6>Tasks state (memory values in pages): <6>[ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name <6>[ 618] 0 618 697 23 8192 0 0 telnetd <6>[ 795] 0 795 697 30 8192 0 0 sh <6>[ 812] 0 812 4761 257 20480 0 0 preview <6>oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),task=preview,pid=812,uid=0 <3>Out of memory: Killed process 812 (preview) total-vm:19044kB, anon-rss:1028kB, file-rss:0kB, shmem-rss:0kB, UID:0 pgtables:20kB oom_score_adj:0 <6>oom_reaper: reaped process 812 (preview), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
这种情况下就需要减少MMA Heap的大小。
3. 调整最合适的MMA Heap¶
在最大场景确定的情况下,为了使MMA Heap不占用多余的内存,可以在最大场景运行时,通过 cat /proc/mi_modules/mi_sys_mma/mma_heap_name0
查看MMA Heap的使用情况:
/ # cat /proc/mi_modules/mi_sys_mma/mma_heap_name0 heap_info: heap_name pa_start length avail mma_heap_name0 102f600000 10000000 f373180
上面输出表示:MMA Heap为256M,avail
表示剩余243M,适当减少MMA Heap的大小,可留给Linux更多内存。