Pcupid 内存使用参考

本文介绍了在Pcupid平台上的内存使用参考。

1. 配置内存

1.1. 编译时

在Pcupid平台上,内存从软件角度被划分为多个区域,本文主要描述MMA Heap 区域和Linux系统内存区域。

  1. MMA Heap区域:MI 模块运行时的内存池,MI模块缓存图像数据所用的内存都是从MMA Heap中申请。

  2. 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更多内存。