分析程序运行内存占用的案例
以下是以公板运行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. 实验步骤¶
-
开机加载完ko后,drop cache再看cat proc/meminfo和 cat /proc/vmallocinfo
cid:image004.png\@01D63B48.8323E4A0
-
运行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
-
对比工具分析运行前后的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的内存占用。