开机可用内存分析Tip

一、开机内存简介

       开机内存指的是开机一段时间稳定后的可用内存。一般项目都会挑选同平台其他优秀竞品内存数据,这个也是衡量性能的一个重要标准。所以要进行开机内存检测,同时优化非法内存进程占用。

二、测试前期核查任务

开机内存测试前要进行测试机对比机内存核查参数。

主要有如下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

开机可用内存分析Tip_第1张图片

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

开机可用内存分析Tip_第2张图片

meminfo中对应PSS 进程大小,Android系统有同意的内存管理策略,lmk基于进程优先级进行进程查杀,值越小优先级越高。

开机可用内存分析Tip_第3张图片

四、开机内存数据处理分析

主要还是从下面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 增大:
1) 新增了进程;
2) 同一个进程线程数增多; 
分析方法:找到新增的进程,找到线程增多的进程

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.属于自启动,但内存占用过多,找对应模块负责人分析

你可能感兴趣的:(AndrPerformance,android,performance,开机)