【2】内存工具-老化峰值内存拆解指导

来源飞书 wiki(obj_token: QTTKdwpzgoCejmxjDQncHSDcnmd)

说明:本文档图片因访问权限(403)无法下载,已用 > 📷 描述占位;文末 1 个 Excel 附件同样 403 失败,已用 > 📎 占位。

本文介绍的内存拆解工具可以跟踪各类内存的分配、释放行为,获取完整的(内核+用户态native+java)调用栈,以方便业务进一步定位

  • 用例失败率高,请咨询@张爽
  • 数据上传、解析失败,请咨询@谢升军
  • 工具使用、采集异常,请咨询@印闯

基础环境搭建:

  • root机器,不要remount过,否则影响调用栈抓取
  • 记得充满电
  • 更新最新代码
  • 内核内存需要使用特殊版本:柯基ID 12240394
  • 参考:静态峰值内存使用说明文档,完成基础测试环境搭建

内存拆解数据抓取

用户态Native堆:单进程采集

打开工具采集开关

静态峰值内存使用说明文档 步骤3的配置文件的执行序列sheet中往右划找到 “测试前只执行一次的操作”,勾选 “执行memuse数据获取”和”获取内存dumpsys间隔自定义

📷 图片描述:图片 addCriterion(token: DNadbsoEWo6Srvx3vIecxSrhn7b,下载失败 403)

设置工具采集参数

找到特定参数sheet页下拉后可看到一些工具参数配置项,按照下面配置即可

参数名称填写项
mem_use_device_name写测试设备的名称,用于PULL日志时区分设备,如P1
mem_use_test_scene写测试场景名称,不要加”_“分隔符,全英文字母,长度小于20字符
mem_use_process_name写测试进程包名
mem_use_start_timebefore_test
mem_use_options_enative
mem_use_options_udwarf
mem_use_options_z保持空
mem_use_options_Z保持空
mem_use_options_kmem_name保持空
其他参数保持不变

📷 图片描述:图片展示的是特定参数sheet页,用于设置内存工具采集参数。其中,mem_use_options_e参数被红色箭头指向,其值值为“native”,对应说明为“设…(token: Iob4bsjgxoNu8yxug6mcMWV9nAb,下载失败 403)

打开自动化解析+执行采集+结果获取

  • 设置待解析用例

框架默认会解析Top20用例峰值数据,如果不想解析时间过长,可以选择只解析自己关注的用例,使用最新的参数模板,在执行序列的指标列把关注的用例选择 “内存指标获取”即可,但是最好不要全部case都选

📷 图片描述:图片展示的是飞书工作表界面,用于设置待解析用例。界面中有“待解析用例”“测试用例类型”“测试用例名称”“测试人及邮箱”等列。关键部分是“指标”列,其中“内存指标…(token: RvabbeKHUopKVyxey55c8KsMnCg,下载失败 403)

  • 打开自动化解析:找到特定参数sheet页,最后面2个参数

📷 图片描述:图片展示的是特定参数sheet页中的部分内容,涉及老化测试日志上传相关参数。第68行参数为“auto_upload_aging_log”,值为“TRUE”,表示…(token: LHjPbxTo5ozsGKxTQP2cHkhdnqe,下载失败 403)

  • 执行main.py文件开始测试
  • 结果获取

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

📷 图片描述:图片展示的是LoadTerminator功耗分析执行结果界面。界面上方显示项目ID、项目名称、开始时间、执行耗时等信息。下方有“点击链接”字样,链接地址为“ht…(token: Ju6Rbi0qKoI9YtxLQBJc6dffnOb,下载失败 403)

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

📷 图片描述:图片展示的是内存工具中内存拆解数据抓取后解析结果的网站界面。左侧导航栏有“性能”“整机负载”“内存”等选项。右侧“内存”选项下,呈现了“system_file_…(token: Y5PebvPrmopAxNxGeIXcVPXpnpg,下载失败 403)

输出解读

输出包含每个case的峰值裁剪数据

📷 图片描述:图片展示的是电脑文件夹界面,路径为“此电脑 > 新加卷 (F:) > download > release_aging >(token: OzyHbjJdLoJo7rxpkKSc7aKGndh,下载失败 403)

📷 图片描述:图片展示的是内存拆解数据抓取中用户态Native堆单进程采集后的部分文件列表。图中有三个红色箭头分别指向不同内容,重点突出了“测试开始到用例峰值点未释放的mal…(token: D0esb2Po6oJUIVxfbGkcDlX6nld,下载失败 403)

用户态文件页拆解:单进程采集

打开工具采集开关

静态峰值内存使用说明文档 步骤3的配置文件的 执行序列sheet中往右划找到 “测试前只执行一次的操作”,勾选 “执行memuse数据获取”和”获取内存dumpsys间隔自定义

📷 图片描述:图片展示的是执行序列sheet中“测试前只执行一次的操作”部分,突出显示了“执行memuse数据获取”和“获取内存dumpsys间隔自定义”两个选项。该图片与文…(token: FBK4bdK02oGUPTx7MnDcKTE2nIb,下载失败 403)

设置工具采集参数

找到特定参数sheet页下拉后可看到一些工具参数配置项,按照下面配置即可

参数名称填写项
mem_use_device_name写测试设备的名称,用于PULL日志时区分设备,如P1
mem_use_test_scene写测试场景名称,不要加”_“分隔符,全英文字母,长度小于20字符
mem_use_process_name写测试进程包名
mem_use_start_timebefore_test
mem_use_options_efilemap
mem_use_options_udwarf
mem_use_options_z保持空
mem_use_options_Z保持空
mem_use_options_kmem_name保持空
其他参数保持默认值不变

📷 图片描述:图片展示的是 自动生成(token: M90MbXLevoLdGmxZozWcoMEEnhg,下载失败 403)

打开自动化解析+执行采集+结果获取

  • 设置待解析用例

框架默认会解析Top用例的峰值数据,如果不想解析时间过长,可以选择只解析自己关注的用例,使用最新的参数模板,在执行序列的指标列把关注的用例选择 “内存指标获取”即可

📷 图片描述:图片展示的是飞书表格界面,用于内存拆解数据抓取中用户态文件页拆解的单进程采集操作。表格中包含序号、场景描述、用例名称、用例备注等列,其中用例名称列有“内存指标获…(token: S75VbbUbgooLfbx4FGYcPK3KnGc,下载失败 403)

  • 打开自动化解析:找到特定参数sheet页,最后面2个参数

📷 图片描述:图片展示的是特定参数sheet页中关于老化测试日志上传的参数设置。其中,“auto_upload_aging_log”参数设置为TRUE,表示老化测试完成后,m…(token: CPE8brMg2o5QfYx3GSOcVSgOnDg,下载失败 403)

  • 执行main.py文件开始测试
  • 结果获取

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

📷 图片描述:图片展示的是LoadTerminator功耗分析执行结果的飞书 addCriterion,呈现项目ID、项目名称、开始时间、执行耗时等信息。关键部分是底部的红框…(token: LqE2buvjQockWmxKdqecbsVAnrb,下载失败 403)

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

📷 图片描述:图片展示的是内存 addCriterion()函数的代码片段。代码中定义了两个参数,一个是self,表示类的实例;另一个是*args,表示可变参数。(token: Bd23b8w6FolqJSxCBHJcwlCfnee,下载失败 403)

输出解读

faults-toggle-embedded.html

📷 图片描述:图片展示的是内存老化峰值内存拆解指导中用户态文件页拆解的Flame Graph界面。界面顶部有有“FlameGraph”字样,下方是“Flame Graph”标…(token: STZMb0lpvoPMVTxtsYRcFZfZnJb,下载失败 403)

用户态Java堆拆解:单进程采集

打开工具采集开关

静态峰值内存使用说明文档 步骤3的配置文件的 执行序列sheet中往右划找到 “测试前只执行一次的操作”,勾选 “获取hprof数据间隔自定义”和”获取内存dumpsys间隔自定义

📷 图片描述:图片展示的是“内存工具-老化测试”中“内存拆解数据抓取”步骤里“设置工具采集参数”时的特定参数配置表。表中包含参数名称及填写项,如mem_use_device_…(token: Tvn1b05OmoMEHHxLRHHch7r8nPb,下载失败 403)

设置工具采集参数

找到特定参数sheet页下拉后按照下面配置即可

参数名称填写项
mem_use_device_name写测试设备的名称,用于PULL日志时区分设备,如P1
mem_use_test_scene写测试场景名称,不要加”_“分隔符,全英文字母,长度小于20字符
mem_use_process_name设置待采集目标进程包名
process_hprof_process_name设置待采集目标进程包名
process_hprof_dur_time设置hprof采样间隔,一般保持默认值即可,可以适当调大调小
其他参数保持默认值不变

📷 图片描述:图片展示的是“特定参数”sheet addCriterion内存工具采集配置中“特定参数”sheet页的内容。其中,红色框突出显示了“process_hprof…(token: Dps9bsercoqLXtxsjSucPQG8nme,下载失败 403)

执行采集+hprof结果获取

执行main.py文件开始测试,测试完成后在代码仓找到本次的测试的输出目录(如/path/to/performance_full_test/src/performance_full_test/test_data/进程峰值/Xiaomi/Xiaomi17Ultra/ad8f8a7f/20260604133310/)

首先根据根据 process_peak_summary.xlsx 中总览找到需要分析的case名和测试轮次

📷 图片描述:图片展示了了测试完成后代码仓目录下的文件情况。其中,process_peak_summary.xlsx文件被红色框突出显示,位于左侧文件夹列表中。该文件与文档中…(token: Gpgebhtjyoijv5xeUsecPza0nZb,下载失败 403)

📷 图片描述:图片展示的是process_peak_summary.xlsx文件中的总览页面。表格包含多列数据,其中部分单元格填充为黄色。表格顶部有蓝色背景的表头,标注了各列…(token: Js1XbGqaHot0zKxABFxciU30nJc,下载失败 403)

之后找到结果文件的process_peak_all_processes.csv

📷 图片描述:图片展示了内存拆解数据抓取中执行采集+hprof结果获取步骤后,代码仓内测试输出目录下的文件列表。其中,“process_peak_all_processes.…(token: RRikbURsmov95uxTQRccTAXCnMb,下载失败 403)

根据case名和cycle 找到对应的hprof文件名。

📷 图片描述:图片展示的是内存拆解数据抓取中执行采集+hprof结果获取阶段的process_peak_all_processes.csv文件内容。画面中有数据表格,其中被红…(token: BpESb5CC6os1ycxC8lUcivhInie,下载失败 403)

然后在hprof_all文件夹找到对应的hprof文件

📷 图片描述:图片展示了内存工具测试后的文件夹内容。其中 自动生成的文件夹中,以“process_peak_all_processes.csv”为代表的文件被突出显示。该文件…(token: PEO3bWJvCoYt9HxPfzQc2vUMnPg,下载失败 403)

内核slab内存拆解:全进程单个子项采集

内核的slab内存分为1)非通用尺寸缓存:vm_area_structdentry_cachetask_struct cache 等 2)通用尺寸缓存kmalloc-32kmalloc-64kmalloc-128,在**/proc/slaninfo**中也可以看到各类slab的占用情况,当前工具支持:

  • 采集非通用尺寸缓存 的某个子项的完整调用栈
  • 采集 通用尺寸缓存 的某个子size的完整调用栈

打开工具采集

静态峰值内存使用说明文档 步骤3的配置文件的 执行序列sheet中往右划找到 “测试前只执行一次的操作”,勾选 “执行memuse数据获取”、“获取内存dumpsys间隔自定义”、“获取slabinfo数据间隔自定义”、“获取procmeminfo数据间隔自定义

📷 图片描述:图片展示的是内存工具采集配置文件的执行序列sheet内容。表格中列出了测试前只执行一次的操作,如获取memuse数据、获取内存dumpsys间隔、获取slabi…(token: YovxbsfGYo4BP5xWbVdc8Vuqnbh,下载失败 403)

设置采集参数

找到特定参数sheet页下拉后可看到一些工具参数配置项

📷 图片描述:图片展示的是内存拆解数据抓取中内核slab内存拆解设置采集参数的参数配置表。表中列出了如mem_use_device_name、mem_use_test_sce…(token: PwgbbjKH4o9NnzxrxRyc5Yz9ntg,下载失败 403)

按照下面配置即可

采集kmalloc的某个子项,如kmalloc-512

参数名称填写项说明
mem_use_device_name写测试设备的名称,用于PULL日志时区分设备,如P1
mem_use_test_scene写测试场景名称,不要加”_“分隔符,全英文字母,长度小于20字符
mem_use_process_namekernelmem
mem_use_start_timeinit_rc
mem_use_options_ekmalloc
mem_use_options_udwarf
mem_use_options_z512只采集大于等于这个size的kmalloc分配
mem_use_options_Z513只采集小于这个size的kmalloc分配
mem_use_options_kmem_name保持空只采集名字为这个的kmem分配
其他参数保持默认值不变

采集kmem的某个子项,如vm_area_struct

参数名称填写项说明
mem_use_device_name写测试设备的名称,用于PULL日志时区分设备,如P1
mem_use_test_scene写测试场景名称,不要加”_“分隔符,全英文字母,长度小于20字符
mem_use_process_namekernelmem
mem_use_start_timeinit_rc
mem_use_options_ekmem
mem_use_options_udwarf
mem_use_options_z0只采集大于等于这个size的kmalloc分配
mem_use_options_Z0只采集小于这个size的kmalloc分配
mem_use_options_kmem_namevm_area_struct只采集名字为这个的kmem分配
其他参数保持默认值不变

打开自动化解析+执行采集+结果获取

  • 设置待解析用例

框架默认会解析Top用例的峰值数据,如果不想解析时间过长,可以选择只解析自己关注的用例,使用最新的参数模板,在执行序列的指标列把关注的用例选择 “内存指标获取”即可

📷 图片描述:图片位于文档“内存拆解数据抓取”部分,展示的是飞书表格界面。表格中包含序号、场景描述、用例名称、用例 addCriterion(token: Yk5hb0wpioGd9BxR5G5cEUwKnqf,下载失败 403)

  • 打开自动化解析:找到特定参数sheet页,最后面2个参数

📷 图片描述:图片展示的是特定参数sheet页中关于老化测试日志上传的参数设置。其中,“auto_upload_aging_log”参数设置为TRUE,“(token: Ra0PbomwBor8UrxObU5cy83tnHe,下载失败 403)

  • 执行main.py文件开始测试
  • 结果获取

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

📷 图片描述:图片展示的是LoadTerminator功耗分析执行结果界面。界面中显示项目ID、项目名称、开始时间、执行耗时等信息。关键部分是下方的“点击链接”处,有一个红框…(token: WCrEbKnHsoPah7xiGgAcB6vknHe,下载失败 403)

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

📷 图片描述:图片展示的是内存工具中内存拆解结果获取界面。左侧为功能导航栏,选中“内存”。(token: DBFfbHBXHoo4ZvxzQrJcNJsknve,下载失败 403)

输出解读

输出中找slab-toggle-embedded.html文件,三个tab如标题所示

📷 图片描述:图片展示的是内存老化峰值内存拆解指导中内核slab内存拆解的全进程单个子项采集结果。画面中呈现了不同颜色的条形图,代表了内存分配和释放的频率,颜色越深表示频率越…(token: VRF6bzASloQGjnx1YDzcbsbknNc,下载失败 403)

内核cma内存拆解:全进程采集

打开工具采集

静态峰值内存使用说明文档 步骤3的配置文件的 执行序列sheet中往右划找到 “测试前只执行一次的操作”,勾选 “执行memuse数据获取”、“获取内存dumpsys间隔自定义”、“获取cmainfo数据间隔自定义

📷 图片描述:图片展示 addCriterion()(token: PAunbPK6IoTuPbxB0lccvQptn4b,下载失败 403)

设置采集参数

找到特定参数sheet页下拉后可看到一些工具参数配置项

📷 图片描述:图片展示的是“特定参数”(token: AM8zbNTVgotfhuxeGysc3MUGnGd,下载失败 403)

按照下面配置即可

参数名称填写项
mem_use_device_name写测试设备的名称,用于PULL日志时区分设备,如P1
mem_use_test_scene写测试场景名称,不要加”_“分隔符,全英文字母,长度小于20字符
mem_use_process_namekernelmem
mem_use_start_timeinit_rc
mem_use_options_ecma
mem_use_options_udwarf
mem_use_options_z0
mem_use_options_Z0
mem_use_options_kmem_name保持空
upload_kernel_boundTRUE
其他参数保持不变

打开自动化解析+执行采集+结果获取

  • 设置待解析用例

框架默认会解析Top用例的峰值数据,如果不想解析时间过长,可以选择只解析自己关注的用例,使用最新的参数模板,在执行序列的指标列把关注的用例选择 “内存指标获取”即可

📷 图片描述:图片展示的是一个Excel表格界面,表格中包含“序号”“场景”“用例名称”“用例描述”“用例类型”“用例标签”“用例状态”“指标”等列。其中“指标”列有“内存指…(token: RXh5b8VEkovXVQxPGEjcEERvnqh,下载失败 403)

  • 打开自动化解析:找到特定参数sheet页,最后面2个参数

📷 图片描述:图片展示了内存工具中自动化解析相关参数设置的表格。其中,“upload_aging_log_username”参数被红色框突出显示,其值 addCriterio…(token: JU9NbsBzuoXe1FxkdhmcKG2XnUf,下载失败 403)

  • 执行main.py文件开始测试
  • 结果获取

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

图片展示的是LoadTerminator功耗分析执行结果界面。界面中显示项目ID、项目名称、开始时间、执行耗时等信息。关键部分是下方的“点击面链接”,其内容为“https://test.loadterminator.mioffice.cn/#/projectSelect?category=%E5%86%85%E5%AD%98&keyword=817cdb77080c4a45a6e1”,该链接用于跳转到网站,在网站可查看解析后的数据卡片详情及下载解析后的数据包,与文档中“结果获取”block_sep]解析完成后飞飞书会通知结果面链接,点击该链接后跳转到网站,在网站会有解析后的数据卡片,选详情,然后点解析包下载,就可以下载解析后的数据包”内容对应。

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

📷 图片描述:图片展示了内存拆解数据抓取后,在网站上获取解析后数据的界面。界面中显示了名为“system_file_map_0416”的内存相关内容,其ID为817cdb77…(token: T5o4bh7USoHs8mxqJ1McTM69nFM,下载失败 403)

输出解读

输出找cma-toggle-embedded.html

  • 全量的火焰图

📷 图片描述:图片展示文档 addCriterion()函数的调用堆栈火焰图。图中火焰图以不同颜色区分函数调用层级,颜色越深表示调用层级越深。图中突出显示了“cma_allo…(token: Gp6fbqT9ooHz6gxpQIec7Hv3nwf,下载失败 403)

  • 按照进程拆解的火焰图,可以查看单进程数据和火焰图

📷 图片描述:图片展示的是cma内存火焰图按进程拆分的数据表格。表格包含进程ID、进程名称、未释放内存大小、计数、火焰图链接等列。其中,火焰图链接列有红色框突出显示,可点击。…(token: NW7vbCUgJoIyHRx94DYcPQRXnwf,下载失败 403)

  • 按照cma名字拆分的火焰图

📷 图片描述:图片图片描述“内存工具-老化峰值内存拆解指导”文档中“输出解读 里解读”部分,展示了按CMA名字拆分的火焰图数据。表格包含cma、unreleased_kb、s…(token: KZbUbVkB2oipacx3gRBcLeXontg,下载失败 403)

内核secpagetable内存拆解:全进程采集

打开工具采集

静态峰值内存使用说明文档 步骤3的配置文件的 执行序列sheet中往右划找到 “测试前只执行一次的操作”,勾选 “执行memuse数据获取”、“获取内存dumpsys间隔自定义”、“获取procmeminfo数据间隔自定义

📷 图片描述:图片展示的是内存拆解数据抓取中设置采集参数时的特定参数sheet|参数名称|填写项|的配置界面。界面中列出了多个参数,如mem_use_devi…(token: Zy9JbypNyoZ1mvx38FacYyyanTe,下载失败 403)

设置采集参数

找到特定参数sheet页下拉后可看到一些工具参数配置项

📷 图片描述:图片展示的是“特定参数”sheet页,用于配置内存工具参数。其中“mem_use_options_e”参数被红色箭头指向突出显示,其值为“native”,对应说…(token: KhecbJP1doJv0Fxs2VJcyzQhn6f,下载失败 403)

按照下面配置即可

参数名称填写项
mem_use_device_name写测试设备的名称,用于PULL日志时区分设备,如P1
mem_use_test_scene写测试场景名称,不要加”_“分隔符,全英文字母,长度小于20字符
mem_use_process_namekernelmem
mem_use_start_timeinit_rc
mem_use_options_esecpagetable
mem_use_options_udwarf
mem_use_options_z0
mem_use_options_Z0
mem_use_options_kmem_name保持空
upload_kernel_boundTRUE
其他参数保持默认值不变

打开自动化解析+执行采集+结果获取

  • 设置待解析用例

框架默认会解析Top用例的峰值数据,如果不想解析时间过长,可以选择只解析自己关注的用例,使用最新的参数模板,在执行序列的指标列把关注的用例选择 “内存指标获取”即可

📷 图片描述:图片展示的是Excel表格界面,上方有“打开自动化解析”等选项。表格 addCriterion(token: CrFhbGip0oc7XoxyCVBc7NVBndd,下载失败 403)

  • 打开自动化解析:找到特定参数sheet页,最后面2个参数

📷 图片描述:图片展示的是特定参数sheet页中的部分内容。其中包括“auto_upload_aging_log”参数,其值为“TRUE”,表示老化测试完成后,mem_use…(token: PpZGboTlyoGK10xKPOhcxloHnM7,下载失败 403)

  • 执行main.py文件开始测试
  • 结果获取

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

📷 图片描述:图片展示的是LoadTerminator功耗分析执行结果界面。界面中显示项目ID、项目名称、开始时间、执行耗时等信息。关键部分是下方的“点击链接”处,有一个红色…(token: SqxebEikSoeqgQxziqRcwAA8nUh,下载失败 403)

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

📷 图片描述:图片展示的是内存工具自动化解析后的数据卡片界面。左侧导航栏有“性能”“整机负载”“内存”等选项,当前选中“内存”。右侧主区域显示内存相关数据,如“system_…(token: Whlwbr7yRoPtwwxI5yqcT3M8n3j,下载失败 403)

输出解读

找汇总的html(/secpagetable-toggle-embedded.html)

  • 所有进程未释放的secpagetable的调用栈

📷 图片描述:图片展示的是内存老化峰值内存拆解指导中,内核secpagetable内存拆解时,所有进程未释放的secpagetable的调用栈。画面中以色块形式呈现调用栈信息…(token: WftobFJEAonE2Xx8rmbcEjxOnW8,下载失败 403)

  • 按照进程拆分的数据

📷 图片描述:图片展示的是内存工具中secpagetable未释放数据的汇总表格。表格按pid汇总,包含进程ID、进程名称、未释放大小(KB)、未释放数量及占比、火焰图等信息…(token: LZvzbuwiMorBPxxIOKOcBPsenJc,下载失败 403)

内核vmalloc内存拆解:全进程采集

内核vmalloc内存,工具支持采集完整的调用栈,部分vmalloc内存只有内核调用栈,需要特殊规则拆解,可参考3.4章节

打开工具采集

静态峰值内存使用说明文档 步骤3的配置文件的 执行序列sheet中往右划找到 “测试前只执行一次的操作”,勾选 “执行memuse数据获取”和”获取内存dumpsys间隔自定义

📷 图片描述:图片展示的是执行序列sheet中“测试前只执行一次的操作”部分,突出显示了“执行memuse数据获取”选项。该图片与文档中“设置采集参数”部分内容相关,对应步骤…(token: F4Dkbp01toyBnDx1msLcqLR4nxd,下载失败 403)

设置采集参数

找到特定参数sheet页下拉后可看到一些工具参数配置项

📷 图片描述:图片展示的是特定参数sheet页中mem_use_options_e参数的配置情况。参数值为native,对应说明是设置mem_use跟踪的内核模块地址空间,仅…(token: Bd3hbBBvSotnb1xoClacResWnzb,下载失败 403)

按照下面配置即可

参数名称填写项
mem_use_device_name写测试设备的名称,用于PULL日志时区分设备,如P1
mem_use_test_scene写测试场景名称,不要加”_“分隔符,全英文字母,长度小于20字符
mem_use_process_namekernelmem
mem_use_start_timeinit_rc
mem_use_options_evmalloc
mem_use_options_udwarf
mem_use_options_z0
mem_use_options_Z0
mem_use_options_kmem_name保持空
其他参数保持默认值不变

打开自动化解析+执行采集+结果获取

  • 设置待解析用例

框架默认会解析Top用例峰值数据,如果不想解析时间过长,可以选择只解析自己关注的用例,使用最新的参数模板,在执行序列的指标列把关注的用例选择 “内存指标获取”即可

📷 图片描述:图片展示的是飞书表格界面,用于设置待解析用例。表格中包含“用例名称”“用例类型”“测试人员邮箱”等列。用例名称列有“耗时_上行_打开评论区”等用例,用例类型列有…(token: Qth2bP3wRo8f1rxuLXycQ4lanKh,下载失败 403)

  • 打开自动化解析:找到特定参数sheet页,最后面2个参数

📷 图片描述:图片展示的是特定参数sheet页中关于老化内存测试日志上传的参数设置。其中,“upload_aging_log_username”参数值为“yinchuang1…(token: DAZEb33mwoJlAVxnsTkcaf1In0c,下载失败 403)

  • 执行main.py文件开始测试
  • 结果获取

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

📷 图片描述:图片展示的是LoadTerminator功耗分析执行结果的飞书通知界面。界面中显示项目ID、项目名称、开始时间、执行耗时等信息。关键部分是下方的“点击链接”处,…(token: OqE6bxlqvo0Xg1xQVVTcGcK0nBg,下载失败 403)

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

📷 图片描述:图片展示的是内存工具中内存拆解数据抓取的“结果获取””步骤相关内容。左侧为LoadTerminator界面,选中“内存 addCriterion内存”选项。右侧…(token: GGJPb8Z2Qo30gHxtsjxcg7Afn7g,下载失败 403)

内核pagetable内存拆解

参考下面3.4章节会得到每个进程的pagetable的占用,单个进程业务也可自行抓取目标进程的/proc//smaps,VMA 数量越多、地址空间越碎片化,页表页消耗越大

内核shmem内存拆解:全进程采集

参考下面3.4章节,输出中会包含进程使用到的共享内存的情况

➜  notslabinfo_all git:(update_noslabinfo_script) ✗ cat shmem_fast_54146220000000.csv| grep "3564|ProcessName" -iE
PID,ProcessName,ShmemRegionPath,RegionPss(KB),ProcessTotalPss(KB)
3564,system_server,/memfd:jit-cache,5266,9256
3564,system_server,[anon_shmem:dalvik-jit-code-cache],2542,9256
3564,system_server,/dev/ashmem/fontMap,22,9256
3564,system_server,/memfd:perfetto_shmem,1384,9256
3564,system_server,/dev/ashmem/MemoryHeapBase,4,9256
3564,system_server,/dev/ashmem/GFXStats-9724,2,9256
3564,system_server,/dev/ashmem/GFXStats-22353,2,9256
3564,system_server,/dev/ashmem/GFXStats-16526,2,9256
3564,system_server,/dev/ashmem/GFXStats-5553,2,9256
3564,system_server,/dev/ashmem/GFXStats-8672,2,9256
3564,system_server,/dev/ashmem/GFXStats-7552,2,9256
3564,system_server,/dev/ashmem/GFXStats-4650,2,9256
3564,system_server,/dev/ashmem/GFXStats-24998,2,9256
3564,system_server,/dev/ashmem/GFXStats-7609,2,9256
3564,system_server,/dev/ashmem/cameraopt_ashmem,2,9256
3564,system_server,/dev/ashmem/scenario_shared_memory,6,9256
3564,system_server,/dev/ashmem/MessageQueue,12,9256
 

内核内存定界(P1 root机器):针对内核同学

slab内存定界

内核的slab内存分为1)非通用尺寸缓存(kmem):vm_area_structdentry_cachetask_struct cache 等 2)通用尺寸缓存(kmalloc)kmalloc-32kmalloc-64kmalloc-128,在**/proc/slaninfo**中也可以看到各类slab的占用情况,slab的内存定界需要分别采集kmalloc和kmem

打开工具采集

静态峰值内存使用说明文档 步骤3的配置文件的 执行序列sheet中往右划找到 “测试前只执行一次的操作”,勾选 “执行memuse数据获取”、“获取内存dumpsys间隔自定义”、“获取slabinfo数据间隔自定义”、“获取procmeminfo数据间隔自定义

📷 图片描述:图片展示的是内存工具-老化峰值内存拆解指导中内核内存定界(P1 root机器)下slab内存定界相关配置文件的执行序列。表格中列出了测试前只执行一次的操作,如执…(token: LUwVbet9QoNILPxcTIncWvgqnvL,下载失败 403)

设置采集参数

找到特定参数sheet页下拉后可看到一些工具参数配置项

📷 图片描述:图片展示的是特定参数sheet页中关于mem_use_options_e参数的设置内容。参数值为native,说明是mem_use_event的默认值,仅nat…(token: Xjb9bA8L4o5tuIxVqwKcxIPintc,下载失败 403)

采集kmalloc全部数据:

参数名称填写项
mem_use_device_name写测试设备的名称,用于PULL日志时区分设备,如P1
mem_use_test_scene写测试场景名称,不要加”_“分隔符,全英文字母,长度小于20字符
mem_use_process_namekernelmem
mem_use_start_timeinit_rc
mem_use_options_ekmalloc
mem_use_options_ufp
mem_use_options_z0
mem_use_options_Z0
mem_use_options_kmem_name保持空
upload_kernel_boundTRUE
其他参数保持不变

采集kmem全部数据:

参数名称填写项
mem_use_device_name写测试设备的名称,用于PULL日志时区分设备,如P1
mem_use_test_scene写测试场景名称,不要加”_“分隔符,全英文字母,长度小于20字符
mem_use_process_namekernelmem
mem_use_start_timeinit_rc
mem_use_options_ekmem
mem_use_options_ufp
mem_use_options_z0
mem_use_options_Z0
mem_use_options_kmem_name保持空
upload_kernel_boundTRUE
其他参数保持不变

打开自动化解析+执行采集+结果获取

  • 设置待解析用例

框架默认会解析Top用例峰值数据,如果不想解析时间过长,可以选择只解析自己关注的用例,使用最新的参数模板,在执行序列的指标列把关注的用例选择 “内存指标获取”即可

📷 图片描述:图片展示的是一个Excel表格界面,表格中包含“序号”“场景”“用例名称”“用例描述”“用例参数”“用例类型”“指标”等列。其中“指标”列有“内存指标获取”“内…(token: EoyfbCxulo1e6cxNbQVczipPnKf,下载失败 403)

  • 打开自动化解析:找到特定参数sheet页,最后面2个参数

📷 图片描述:图片展示的是“特定参数”sheet页中部分参数内容。其中第69行参数为“upload_aging_log_username”,当前值是“yinchuang1”。…(token: J9Vbbwjqco2CGtxCmA1cVyxTnWe,下载失败 403)

  • 执行main.py文件开始测试
  • 结果获取

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

📷 图片描述:图片展示的是LoadTerminator功耗分析执行结果的飞书通知界面。界面中显示项目ID、项目名称、开始时间、执行耗时等信息。关键部分是下方的“点击链接”处,…(token: AfzIbe458ojcFpxRVwXcJJ6inBb,下载失败 403)

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

📷 图片描述:图片展示了在执行“内核内存定界(P1 root机器)”中“slab内存定界”的“打开自动化解析+执行采集+结果获取”步骤后,获取解析结果的操作界面。界面显示了名…(token: SMcubUT8Hop3vWxfnNEcluWlnXe,下载失败 403)

cma内存定界

参考上面2.5 cma内存拆解即可,定界skill按照进程名、cma name定界

secpagetable内存定界

参考上面2.6 secpagetable内存拆解即可,定界skill按照进程名定界

Vmalloc/pagetable/shmem

打开工具采集开关

静态峰值内存使用说明文档 步骤3的配置文件的执行序列sheet中往右划找到 “测试前只执行一次的操作”,勾选 “获取noslabinfo数据间隔自定义”和”获取内存dumpsys间隔自定义”,只开启这俩个

📷 图片描述:图片展示的是文档中“打开工具采集开关”步骤的配置文件执行序列相关内容。表格中“测试前只执行一次的操作”列,有“获取noslabinfo数据间隔自定义”和“获取内…(token: JAQabOR2DoVjg1xdIPccZmEGnLf,下载失败 403)

设置采集参数

找到特定参数sheet页下拉后可看到一些工具参数配置项

📷 图片描述:图片展示的是特定参数sheet页,用于设置内存工具采集参数。其中,红色箭头指向“mem_use_options_b”参数,其值为256,对应说明为“设置mem_…(token: HDO2bPHuUoSTqmxX4J3c8LFCnih,下载失败 403)

按照下面配置

upload_kernel_boundTRUE
其他参数保持默认值不变

打开自动化解析+执行采集+结果获取

  • 设置待解析用例

框架默认会解析Top用例峰值数据,如果不想解析时间过长,可以选择只解析自己关注的用例,使用最新的参数模板,在执行序列的指标列把关注的用例选择 “内存指标获取”即可

📷 图片描述:图片展示的是文档中“设置待解析用例”步骤的配置界面。界面中“待解析用例”列下,有“内存指标获取”选项被勾选。上方工具栏有“新建”“删除”“复制”等操作按钮。该图…(token: IoLOb5a7UoMOUHxV5FicHSKSn5e,下载失败 403)

  • 打开自动化解析:找到特定参数sheet页,最后面2个参数

📷 图片描述:图片位于介绍内存工具老化峰值内存拆解指导时,用于设置采集参数。图片中“特定参数”sheet页显示了两个关键参数配置项,分别是“auto_upload_aging…(token: NlPCb5hOBoBoHjxTguNcpaTqnvg,下载失败 403)

  • 执行main.py文件开始测试
  • 结果获取

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

📷 图片描述:图片展示的是LoadTerminator功耗分析执行结果的飞书通知界面。界面中显示项目ID、项目名称、开始时间、执行耗时等信息。关键部分是下方的“点击链接”处,…(token: VeYoboYXwooM05xj4Esc6F6xnEe,下载失败 403)

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

📷 图片描述:图片展示的是LoadTerminator网站内存解析结果页面。左侧导航栏有“性能”“整机负载”“内存”等选项,当前选中“内存”。右侧显示内存解析结果系统文件映射…(token: GTm9b2qSko1ISNxt2EPc2Ip5nVg,下载失败 403)

输出解读

框架会不断的采集/proc/vmallocinfo、/proc/modules、bpf程序map使用情况、各个进程的线程数量、进程的共享内存使用情况等,后续会根据峰值时刻找到对应的采集文件,然后走定界skill进行定界

📎 附件:Excel 工作簿附件(token: UXS3bzGfVoKSOexowTfc3z0jnhf,下载失败 403)

Pagetable

不断的读取所有进程的/proc//status中VmPTE,后续根据峰值点按照进程进行拆解

  PID,ProcessName,VmPTE(KB)
  22353,com.ss.android.ugc.aweme,8548
  3564,system_server,5992
  24998,com.tencent.mm,5660
  5553,com.android.systemui,4452
  2064,vendor.qti.camera.provider-service_64,3744
  4650,com.miui.home,3704
  24971,com.tencent.mm:push,2708
  8672,com.miui.securitycenter.remote,2300
  7552,com.miui.personalassistant,2280
  9014,com.xiaomi.market,2216
  5467,com.android.phone,2080
 

Shmem

➜  notslabinfo_all git:(update_noslabinfo_script) ✗ cat shmem_fast_54146220000000.csv| grep "3564|ProcessName" -iE
PID,ProcessName,ShmemRegionPath,RegionPss(KB),ProcessTotalPss(KB)
3564,system_server,/memfd:jit-cache,5266,9256
3564,system_server,[anon_shmem:dalvik-jit-code-cache],2542,9256
3564,system_server,/dev/ashmem/fontMap,22,9256
3564,system_server,/memfd:perfetto_shmem,1384,9256
3564,system_server,/dev/ashmem/MemoryHeapBase,4,9256
3564,system_server,/dev/ashmem/GFXStats-9724,2,9256
3564,system_server,/dev/ashmem/GFXStats-22353,2,9256
3564,system_server,/dev/ashmem/GFXStats-16526,2,9256
3564,system_server,/dev/ashmem/GFXStats-5553,2,9256
3564,system_server,/dev/ashmem/GFXStats-8672,2,9256
3564,system_server,/dev/ashmem/GFXStats-7552,2,9256
3564,system_server,/dev/ashmem/GFXStats-4650,2,9256
3564,system_server,/dev/ashmem/GFXStats-24998,2,9256
3564,system_server,/dev/ashmem/GFXStats-7609,2,9256
3564,system_server,/dev/ashmem/cameraopt_ashmem,2,9256
3564,system_server,/dev/ashmem/scenario_shared_memory,6,9256
3564,system_server,/dev/ashmem/MessageQueue,12,9256
 

vmalloc

copy_process

不断的读取所有进程的/proc//status中Threads,后续根据峰值点按照进程进行拆解定界

pid,name,thread_count
  1,init,3
  288,init,1
  289,ueventd,1
  342,com.android.settings:remote,31
  377,com.miui.weather2,44
  421,com.android.htmlviewer,23
  485,prng_seeder,1
  511,audioadsprpcd,3
  587,com.xiaomi.market,146
  698,com.milink.runtime,49
  859,com.android.camera,105
  978,logd,8
 
bpf

不断的获取机器上bpf程序用到的map,后续按照map定界

sys/fs/bpf/miui/prog_tclimiter_skfilter_tclimiter_xtbpf|prog|94|1|4096|1|28|0|0
  /sys/fs/bpf/miui/map_tclimiter_uid_tclimiter_map|map|108|1|323264|4|1|4000
  /sys/fs/bpf/miui/map_pic_watch_rb|map|104|27|144168|0|0|131072
  /sys/fs/bpf/miui/prog_pic_watch_kprobe_vfs_unlink|prog|92|2|4096|1|2763|0|0
  /sys/fs/bpf/miui/map_MiuiDamonAggr_damon_map|map|102|13|2176|4|4|5
  /sys/fs/bpf/miui/map_MiuiDamonAggr_damon_status_map|map|100|1|2352|4|12|6
  /sys/fs/bpf/miui/prog_MiuiDamonAggr_damon_aggregated_tracepoint|prog|89|5|4096|1|4|0|0
 
load_module

不断的读取/proc/modules,后续根据峰值点按照module进行拆解

  machine_dlkm 126976 0 - Live 0x0000000000000000 (O)
  qca_cld3_peach_v2 13312000 0 - Live 0x0000000000000000 (O)
  rmnet_offload 32768 0 - Live 0x0000000000000000 (O)
  rmnet_shs 192512 0 - Live 0x0000000000000000 (O)
  swr_dmic_dlkm 28672 0 - Live 0x0000000000000000 (O)
  rmnet_aps 36864 0 - Live 0x0000000000000000 (O)
  rmnet_wlan 57344 0 - Live 0x0000000000000000 (O)
  rmnet_perf_tether 28672 0 - Live 0x0000000000000000 (O)
 
vmalloc-其他

按照caller名字直接定界

内核内存定界(荣耀root但不能remount机器)