MTK平台 Camera 内存(1)介绍

前言

   之前对这部分的内容了解很少,这次重要参考MTK官网文档《MTK_Camera_Memory_Introduction_and_Debug.pdf》,结合项目上的一些log来进行学习。后续有遇到类似的问题,会在这里继续补充

一、Camera RAM Memory Overiew

     1.1 Android RAM Memory Layout

从 camera 角度理解 total RAM,分为 Free(剩余 memory),Others(非 camera 模块),Camera APP,cameraserver, camerahalserver,以及 Linux Kernel。

另外整个手机不只有 Linux, 还有其他作业系统同时运行. 所以会切走一块 Reserved,i.e Modem.

1.2 Camera Total RAM

Camera total ram 包含 Camera APP,cameraserver,camerahalserver 三个进程。

Camera APP 

         相机 APP 本身占用的空间, 往往客人会有自己的 APP

          i.e. MTK 內部相机 app 占用 memory 介于 50MB~130MB 

cameraserver 

          Google AOSP 原生代码, 同样 Android 版本的用量应该差不多

          它的內存用量与 APP 当前的行为强相关. 目前观察到 cameraserver 比较大的用量都是 ImageReader 建立的 buffer, 用 来传输给 camerahalserver 当最后影像输出的目的地

camerahalserver

       MTK 实现的部分, 也是我们重点关注的区域

1.3 Camerahalserver - Level 1 Breakdown

     1.3.1 什么是ION?

           ION 是当前 Android 流行的内存分配管理机制。

           ION,最显著的特点是它可以被用户空间的进程之间或者内核空间的模块之间进行内存共享,而且这种共享可以是零拷贝的。在实际使用中,ION 和 VIDEOBUF2、DMA-BUF、V4L2 等结合的很紧密

     1.3.2 camerahalserver

      camerahalserver level 1 breakdown 分别 non-ion 和 ion 两个部分:(camera app 和 cameraserver 也是类似)

Non-ION

         CPU 可存取, 没特別要求, 通常会是这一类

         此类对系统负担较轻, 因为各种技术成熟(virtual address space, CPU L1/L2/L3 cache, zram swap, .....)

ION

         可给硬体存取 (GPU / ISP ...) , 可跨 process , 跨 kernel 进行內容分享 (zero copy )

         因为相机资料量大, ION 用量会是 Camera memory footprint 的关注焦点

         此类对系统的负担较重,因为往往需要一大块。

1.4 Camerahalserver - Level 2 Breakdown

     

Non-ION:常常放一般 software process 该放的东西, Heap / global variable / stack /...

ION:存放一堆 camera frame buffers 以及需要跨 kernel 的大型 working buffer( i.e. 3A tunning data from userspace to kernel driver )

1.5 VSS\RSS\PSS\USS

      

学习内存需要理解 VSS, RSS, PSS, USS 四个名词的含义[1]:

VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的全部内存,以及分配但未使用内存)。其大小还包括了可能不在 RAM 中的内存(比如虽 然 malloc 分配了空间,但尚未写入)。VSS 很少被用于判断一个进程的真实内存使用量。

RSS - Resident Set Size 实际使用物理内存(包含共享库占用的全部内存)。但是 RSS 还是可能会造成误导,因为它仅仅表示该进程所使用的所有 共享库的大小,它不管有多少个进程使用该共享库,该共享库仅被加载到内存一次。所以 RSS 并不能准确反映单进程的 内存占用情况

PSS - Proportional Set Size

实际使用的物理内存(比例分配共享库占用的内存,按照进程数等比例划分)。例如:如果有三个进程都使用了一个共享 库,共占用了 30 页内存,那么 PSS 将认为每个进程分别占用该共享库 10 页的大小。 PSS 是非常有用的数据,因为系统 中所有进程的 PSS 都相加的话,就刚好反映了系统中的 总共占用的内存。 而当一个进程被销毁之后, 其占用的共享库 那部分比例的 PSS,将会再次按比例分配给余下使用该库的进程。这样 PSS 可能会造成一点的误导,因为当一个进程被 销毁后, PSS 不能准确地表示返回给全局系统的内存。

USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)。USS 是非常非常有用的数据,因为它反映了运行一个特定进程真 实的边际成本(增量成本)。当一个进程被销毁后,USS 是真实返回给系统的内存。当进程中存在一个可疑的内存泄露时, USS 是最佳观察数据。

他们内存占用大小有如下规律:VSS >= RSS >= PSS >= USS。

二、常见抓内存的工具

    2.1、camera 内存测量命令行

Command Note
adb shell cat /proc/meminfo [Linux kernel]系统角度 memory 的使用情况
adb shell dumpsys meminfo [Android] dumpsys meminfo all process
adb shell dumpsys meminfo [pid] [Android] dumpsys meminfo single process
adb shell cat sys/kernel/debug/ion/ion_mm_heap [MTK] ion(need root)
adb shell cat proc/`pidof [pid]`/smaps [Linux kernel] non-ion(need root)
adb shell "showmap `pidof [pid]`" [Android] non-ion(need root)(只是编到 debug 版本)
adb shell "pmap -x `pidof [pid]`" [Android] non-ion(need root)

      

这块说下,921 是camerahalserver的进程号

     2.2、抓内存bash脚本       

#!/bin/bash
#alias adb="adb -s 142090720312"
trap "" HUP
let TOTAL_COUNT=100
let COUNT=0

function do_camera_test {
   #adb shell input keyevent 27
   echo "capture count=$COUNT"
   sleep 3
   if [ $(($COUNT%10)) =  0 ];then
   adb  shell dumpsys meminfo > shuju/meminfo_$COUNT.txt
   adb  shell dumpsys meminfo camerahalserver > shuju/halmeminfo_$COUNT.txt
   adb  shell dumpsys meminfo cameraserver > shuju/srvmeminfo_$COUNT.txt
   adb  shell dumpsys meminfo com.android.camera > shuju/appmeminfo_$COUNT.txt
   fi
   let COUNT++
}

#adb shell am start com.android.camera
while [ $COUNT -le $TOTAL_COUNT ]
do
    do_camera_test
done

             使用这个脚本之后,会生成四种文件meminfo.txt 、halmeminfo.txt、srvmeminfo.txt、appmeminfo.txt

      

猜你喜欢

转载自blog.csdn.net/weixin_38328785/article/details/113649856