分析程序运行内存占用的案例

以下是以公板运行mixer为例子,详细说明内存如何分配。

1. 实验设备

335+imx307 sensor

2. 实验场景

(典型案例)mixer路4路流:JPEG + 主码流 + 子码流 + MD算法

3. 实验基础

SDK里kernel space 下ko有两种内存申请方式:

  • vmalloc

    分配大块内存,走budysystem;通过cat/proc/vmallocinfo可以统计;

  • kmalloc/kmem_cache_create

    分配小于pagesize,走slab机制);通过cat/proc/meminfo里的slab字段可以统计。

内核中常见的还有如alloc_pages/__get_free_page,只能通过free统计,但目前看起来只有emmc会调用。

Ioremap:I/O内存资源的物理地址映射到核心虚地址空间,不占用物理空间;

PageTable:用于将内存的虚拟地址翻译成物理地址,/proc/meminfo中的PageTables统计了Page Table所占用的内存大小。

KernelStack:每一个用户线程都会分配一个kernel stack(内核栈),它是kernel消耗的内存。统计值是/proc/meminfo的KernelStack。

Userspace中常见malloc,小于128K走c标准库的brk,大于128K走mmap,但对于内核来说,一旦发生缺页中断,都是走pageallocater。可以通过procmem工具统计实际占用的物理空间(实际上就是把cat /proc/PID/smap里的RSS/PSS之和)。

4. 实验步骤

  1. 开机加载完ko后,drop cache再看cat proc/meminfo和 cat /proc/vmallocinfo

    cid:image004.png\@01D63B48.8323E4A0
    
  2. 运行mixer后,drop cache再看cat proc/meminfo和 cat /proc/vmallocinfo和 cat/proc/’PID’/status和./procmem PID

    cid:image005.png\@01D63B48.8323E4A0
    

    cid:image003.png\@01D63B48.2FAFE8F0
    

    cid:image007.png\@01D63B4A.2E5290F0
    
  3. 对比工具分析运行前后的vmalloc增加部分:

    cid:image006.jpg\@01D63B4A.BF59CB40
    

5. 总结

free减少 = 16836 – 8888 = 7948K

Vmalloc增加:547page = 2188K

lab增加:6328 – 4792 = 1536K

PageTable+KernelStack增加:536+116 – (352+52) = 248K

应用代码段+so 代码段 + 栈 + ro段+堆 = 3732K (Pss)

2188 + 1536 + 248 + 3732 = 7704K,因为Linux kernel并没有滴水不漏地统计所有的内存分配,kernel动态分配的内存中就有一部分没有计入/proc/meminfo中。我们只能大概的统计出来mixer的内存占用。