内存工具-老化内存/老化峰值内存指导
什么是老化内存?
指模拟用户日常高频操作、多应用常驻、长时间运行后(大概1000+用例),设备整机与各进程累积形成的内存状态,会叠加内存泄漏、资源滞留、碎片堆积等问题,还原真实长期使用后的内存现状
各进程老化内存(含峰值内存)指标数据如何采集?
采集
非root机器上老化指标数据采集(包含老化峰值内存和老化后内存)参考进程老化模型使用说明文档 文档中步骤1-3
解析和输出解读:分为老化峰值解析和老化后留存内存解析
- 老化留存 :采集结束后会自动完整解析,查看GC后的留存数据
里面有各类sheet可查看,关注进程分布表

-
老化峰值:采集结束后会自动完整解析 有问题可咨询@张爽

内存趋势汇总表有最后峰值的数据

meminfo详情表有每个时间点采样时候内存情况,可画成曲线,查看波动情况
进程老化内存(含峰值内存)如何进一步定位?需要root机器(注意不要remount过)
【重要】数据自动化解析,支持native堆、文件页
**【重要】**数据解析已支持 自动打包 → 上传内存网站 → 后台解析 → 通知用户下载,测试前记得设置以下选项

解析完成后飞书会通知结果,

点击飞书红框链接后跳转到网站,在网站会有解析后的数据卡片,选详情,然后点解析包下载,就可以下载解析后的数据包

需要分析native堆(包含老化留存和老化峰值)
基本思路:
同时采集showmap + memuse数据(包含未释放的malloc的调用栈和size信息),后续找到showmap中native堆峰值时刻,从memuse中裁剪出对应时间段数据
开始采集:
参考进程老化模型使用说明文档 文档中步骤1-3,在执行序列页面将测试前只执行一次的操作改为勾选”执行memuse数据获取”和”获取showmap数据间隔自定义”两项

在特定参数页面的模型特定参数配置中配置mem_use和showmap相关的参数(下图中红框中的参数都需要正确配置)。

红框中的参数配置直接参数说明即可。但是mem_use启动参数的配置需要注意一下:
mem_use_start_time:填写mem_use采集工具的启动时机。before_test即可
~~init_rc:在开机阶段启动mem_use采集进程(内核当前不支持~~)。
before_test: 在老化测试用例执行之前启动mem_use采集进程。
init_rc_tmp:在开机阶段启动mem_use采集进程。(当前为规避内部BUG的模式,此模式需要使用特定Patch版本,请找@印闯协调Patch版本)
检查输出是否完整
老化测试正常结束后,会采集到如下的日志。如果日志有缺失说明采集过程有异常。

解析&& 输出解读:
解析:
方法1:如果 3.1 中已经打开自动上传选项,老化测试跑完后会自动打包、上传、解析、通知用户下载,有问题可以咨询@谢升军 https://mi.feishu.cn/wiki/G9OywGvUKi8KyOkjSIWci3SbnZe#share-FNwPdOk9yodBE9xcY3scfAK8n1e
方法2:如果忘记打开了自动上传选项,可以使用一键上传脚本老化内存数据自动打包上传脚本,有问题可以咨询@谢升军
方法3:本地解析:请参考内存工具系列-老化场景日志解析指导,有问题请咨询@钟万勇
输出解读:
- 老化留存请关注下面红色文件
➜ systemui_p1_aging_out tree -L 1
.
├── callstack
├── max // 老化峰值数据(按照showmap中native堆的pss)
├── showmap_analysis
├── systemui_p1_aging_memuse.info_flamegraph.html // 同开机场景,整个老化过程未释放malloc调用栈的火焰图
├── systemui_p1_aging_memuse.info_flamegraph.json
├── systemui_p1_aging_memuse.info_merged.symbolized_anonymous_func.csv
├── systemui_p1_aging_memuse.info_merged.symbolized_anonymous_invalid_event.txt
├── systemui_p1_aging_memuse.info_merged.symbolized_anonymous_lib.csv
├── systemui_p1_aging_memuse.info_merged.symbolized_java_func.csv
├── systemui_p1_aging_memuse.info_merged.symbolized_java_invalid_event.txt
├── systemui_p1_aging_memuse.info_merged.symbolized_java_lib.csv
├── systemui_p1_aging_memuse.info_merged.symbolized_native_func.csv // 同开机场景,整个老化过程 按照函数拆分的malloc数据
├── systemui_p1_aging_memuse.info_merged.symbolized_native_invalid_event.txt
├── systemui_p1_aging_memuse.info_merged.symbolized_native_lib.csv // 同开机场景,整个老化过程 按照库拆分的malloc数据
└── systemui_p1_aging_memuse.info_merged.symbolized_raw_data.csv
3 directories, 12 files
- 老化峰值:请关注max文件夹中下面的红色文件(已按照showmap中native堆PSS峰值时间戳进行了裁剪)
➜ max tree -L 1
.
├── callstack
├── max_systemui_p1_aging_memuse.info_flamegraph.html // 按照峰值时间戳裁剪后的malloc调用栈火焰图(已经去掉释放的部分)
├── max_systemui_p1_aging_memuse.info_flamegraph.json
├── max_systemui_p1_aging_memuse.info_merged.symbolized_anonymous_func.csv
├── max_systemui_p1_aging_memuse.info_merged.symbolized_anonymous_invalid_event.txt
├── max_systemui_p1_aging_memuse.info_merged.symbolized_anonymous_lib.csv
├── max_systemui_p1_aging_memuse.info_merged.symbolized_java_func.csv
├── max_systemui_p1_aging_memuse.info_merged.symbolized_java_invalid_event.txt
├── max_systemui_p1_aging_memuse.info_merged.symbolized_java_lib.csv
├── max_systemui_p1_aging_memuse.info_merged.symbolized_native_func.csv // 按照峰值时间戳裁剪后的函数粒度拆分的malloc数据(已经去掉释放的部分)
├── max_systemui_p1_aging_memuse.info_merged.symbolized_native_invalid_event.txt
├── max_systemui_p1_aging_memuse.info_merged.symbolized_native_lib.csv // 按照峰值时间戳裁剪后的库粒度拆分的malloc数据(已经去掉释放的部分)
└── systemui_p1_aging_memuse.info_merged.symbolized_raw_data.csv
└── max_systemui_p1_aging_memuse.info_merged.symbolized_raw_data.csv
需要分析文件页(包含老化留存和老化峰值)
基本思路:
老化留存:使用memsue工具采集老化过程文件页访问行为(会有访问的调用栈)
老化峰值:同时采集smaps+ memuse数据(包含文件页的访问信息),后续找到smaps中文件页峰值时刻,从memuse中裁剪出对应时间段数据
开始采集:
参考进程老化模型使用说明文档 文档中步骤1-3,在执行序列页面将测试前只执行一次的操作改为勾选”执行memuse数据获取”和”获取smaps数据间隔自定义”两项

在特定参数页面的模型特定参数配置中配置mem_use采集事件为filemap

检查输出是否完整:
老化测试正常结束后,会采集到如下的日志。如果日志有缺失说明采集过程有异常。



解析&& 输出解读:
- 解析:方法1:参考3.1中打开自动上传选项,老化测试跑完后会自动打包、上传、解析、通知用户下载,有问题可以咨询@谢升军方法2:如果忘记打开了自动上传选项,可以使用一键上传脚本老化内存数据自动打包上传脚本,有问题可以咨询@谢升军方法3:本地解析:请参考内存工具-文件页内存拆解指导有问题请咨询 @印闯
- 老化留存和峰值输出可参考内存工具-文件页内存拆解指导
需要分析java堆、匿名页(包含老化留存和老化峰值)
1)基本思路:
需要分析java:采集showmap + hprof,后续找到showmap中java堆最大时刻,匹配临近的hprof分析
2)采集:参考进程老化模型使用说明文档 文档中步骤1-3,在执行序列页面将测试前只执行一次的操作改为勾选”获取hprof数据间隔自定义”和”获取showmap数据间隔自定义”两项

- 在特定参数页面的模型特定参数配置中配置dumpsys,showmap和hprof相关的参数(下图中红框中的参数都需要正确配置)。

3)检查输出是否完整:关注showmap_all和hprof_all下面均有大量输出文件

4)解析:参考内存工具系列-老化场景日志解析指导,有问题可咨询@钟万勇
5)输出解读:
- 老化留存
1)java堆:hprof_all文件夹中找到最后一个hprof进行分析 或者 在2.2 章节非root机器上老化结束也会采集hprof

2)匿名页:showmap_all找到最后一个showmap进行分析

- 老化峰值:关注aging_showmap_max_result.txt中的
java堆:找到下面字段,查看峰值对应的hprof文件
[PSS Java Heap (匿名页-Java) 峰值]
文件: systemui_dijun_294750000000_iter1_showmap_9.txt
文件编号: 9
测试场景: systemui 设备: dijun 轮次: iter1
起始时间戳: 250910000000 (9921-01-09 06:13:20)
峰值时间戳: 294750000000 (未知)
峰值: 52453 KB
最近的hprof文件: systemui_dijun_291120000000_iter1_hprof_5.hprof匿名页:关注峰值对应的showmap
[PSS 匿名页-其他 峰值]
文件: systemui_dijun_294750000000_iter1_showmap_9.txt
文件编号: 9
测试场景: systemui 设备: dijun 轮次: iter1
起始时间戳: 250910000000 (9921-01-09 06:13:20)
峰值时间戳: 294750000000 (未知)
峰值: 17795 KB