一、开机内存简介
开机内存指的是开机一段时间稳定后的可用内存。一般项目都会挑选同平台其他优秀竞品内存数据,这个也是衡量性能的一个重要标准。所以要进行开机内存检测,同时优化非法内存进程占用。
二、测试前期核查任务
开机内存测试前要进行测试机对比机内存核查参数。
主要有如下7类:
1.内存压缩参数ZRAM
zram压缩方法 :/sys/block/zram0/comp_algorithm
zram大小:/sys/block/zram0/disksize
swappiness:/proc/sys/vm/swappiness
direct_swappiness:/proc/sys/vm/direct_swappiness
2.kswap参数
extra_free_kbytes:/proc/sys/vm/extra_free_kbytes
min_free_kbytes:/proc/sys/vm/min_free_kbytes
watermark_boost_factor:/proc/sys/vm/watermark_boost_factor
lowmem_reserve_ratio:/proc/sys/vm/lowmem_reserve_ratio
watermark_scale_factor:/proc/sys/vm/watermark_scale_factor
3.lmk参数
getprop | grep lmk
4.虚拟机参数
getprop | grep heap
5.cache个数
dumpsys activity settings | grep CUR_MAX
6.zoneinfo
proc/zoneinfo | grep -in -E "Node |min |low |high |managed "
7.压缩和冻结情况
dumpsys activity settings |grep -e use_compaction -e use_freezer
三、开机内存检测
1.测试步骤
刷机后默认跳过开机向导,设置为新手机,不插卡,不联网,手机默认状态下,亮度调节最大,关闭自动背光,清理状态栏通知和后台应用。下面三个要注意:
1)开机时间要舍弃前面1-3次数据。
2)如果状态栏有其他通知,除了要清理通知,还要重启一次。
3)看下多任务里面是否还有其他后台任务,有的话要清理掉。
2.不同DDR 可用内存建议标准
目前开机内存指标为MemAvaiable MemAvaiable ~MemFree+Buffers+Cached+IonTotalCache
不同内存有不同开机内存标准值:建议值(一般达不到,除非是driveronly原生系统)
6+64:可用内存建议参考值:2.5G
6+128:可用内存建议参考值:3.9G
8+256:可用内存建议参考值:5.4G
3.开机内存测试数据来源以及对应含义
数据由指令 adb shell cat proc/meminfo 获取
1)Mem_Free -----系统空闲内存
取值:MemAvailable
2)Zram-----ZRAM交换空间大小
取值:SwapTotal - SwapFree
3)Kernel Used-----Kernel使用内存大小
取值:SUnreclaim + KernelStack + PageTables + Shmem + VmallocUsed
4)IonTotalUsed-----Ion使用大小
取值:IonTotalUsed
5)GPUTotalUsed-----GPU使用内存大小
取值:GPUTotalUsed
6)Platform Reserved-----平台预留内存
取值:总内存 -- MemTotal
meminfo中对应PSS 进程大小,Android系统有同意的内存管理策略,lmk基于进程优先级进行进程查杀,值越小优先级越高。
四、开机内存数据处理分析
主要还是从下面Mem_Free、Zram、Kernel Used、IonTotalUsed、GPUTotalUsed、Platform Reserved参数进行对比,尤其是meminfo中个进程的内存占用大小对比。
SystemRam 划分为两个部分,PlatformReserved和MemTotal,MemTotal是系统能自由分配使用内存大小。MemTotal主要包括kernel use,free 和user space。内存差异主要体现在PlatformReserved、kernel use、user space。
1.Platform_Reserved
Platform_Reserved差异就是MemoryTotal差异。Platform_Reserved = 实际物理内存 - MemTotal,需要分别解析出对比机和测试机的模块预留,通过对比可以看出是否有新增的模块或是内存占用明显变化的模块。由于这部分内存与硬件设备强相关,我们需要向高通或MTK提case咨询能否去除。
2.kernel used
kernel used = Shmem+SUnreclaim+KernelStack+PageTables+VmallocUsed这部分差异给BSP进行拆解
SReclaimable: slab 中可回收的部分,调用 kmem_getpages()时加上SLAB_RECLAIM_ACCOUNT 标记,表明是可回收的,计入 SReclaimable,否则计入 SUnreclaim。
SUnreclaim: slab 中不可回收的部分。
Slab: slab 中所有的内存,等于以上两者之和。数据来源:cat /proc/meminfo
3.kernel stack
每一个用户线程都会分配一个 kernel stack(内核栈),每个线程内核栈大小:16KB,KernelStack 的大小完全由系统中的线程数决定。该值增大一般是进程或线程数增多。 KernelStack = 线程数* 16KB
统计值是 /proc/meminfo 中的 KernelStack 。有两种情况会导致 KernelStack 增大:
-
新增了进程;
-
同一个进程线程数增多;
分析方法:找到新增的进程,找到线程增多的进程
4.VmallocUsed
VmallocUsed 值中,具体分布可以从/proc/vmallocinfo 中的 vmalloc 记录看到。
/proc/vmallocinfo 中能看到 vmalloc 来自哪个调用者(caller),这个调用者也是定位是哪个模块调用的关键信息。
通过 vmalloc 分配的内存,通过命令
adb shell cat /proc/vmallocinfo > vmallocinfo.txt 都可以抓取到详细的分配信息,且通过如下命令
grep vmalloc /proc/vmallocinfo | awk '{total+=$2}; END {print total}' 可以计算通过 vmalloc 分配总共分配了多大的内存。
5.Userspace
Userspace的内存是所有的进程(包括java层以及native层)的内存使用量之和,在内存占用中体现为匿名页占用+Zram占用。Zram用量一般为swap用量的1/3,即(Swaptotal-swapfree)/3。
建议差异分析其他问题点
1.手机分辨率、屏幕密度。720P和1080P对于带图片的应用比如桌面、systemui、相机、相册等是有影响的,所以排查进程差异时,需要考虑在内,可以设置相同分辨率后再比较
2.GMS包是否都存在以及其版本是否一样。升级项目一般会因为GMS包版本跨度大导致进程差异较大
3.排查不应该自启动的进程,或者可以不需要自启动的应用
4.属于自启动,但内存占用过多,找对应模块负责人分析