PPT · 第 1 页 · 封面
METHODOLOGY POSTER · MEMORY PERFORMANCE
内存性能优化方法论:从商用体验到优化落地
A FIVE-STAGE CLOSED-LOOP FROM FIELD EXPERIENCE TO SHIPPED OPTIMIZATION
五个阶段,五个问题 —— 每个阶段只回答一个问题,上一阶段的产出就是下一阶段的输入;两条回流箭头让它成为闭环而非单向流水线。
⬇ 下载 PPT 版本(.pptx · 11 页)
v7 · 网页与 PPT 逐页同步
2026-09-30
PPT · 第 2 页 · 总览
▼
测什么才有代表性?
- 从商用体验提取典型场景与用户痛点
- 固化为可复现、可重复执行的负载模型
场景提取负载固化可复现
产出 ▸ 可重复执行的负载模型
模型➜▼
执行中内存到底怎么变?
- 白盒方式逐时刻采集内存统计信息
- 变化趋势与模型执行阶段精确对齐
白盒采集逐时刻阶段对齐
产出 ▸ 全程内存变化趋势曲线
趋势曲线➜▼
问题出在哪?
- 识别异常段:尖峰 / 持续增长 / 平台期 / 抖动
- 异常归因到具体流程与机制
异常识别归因分析
产出 ▸ 关键路径与具体结论
关键路径➜▼
别人为什么没这个问题?
- 针对瓶颈对应流程做竞品横向对比
- 将做法差异转化为优化点
竞品对比差异转化
产出 ▸ 差异点与优化点清单
优化点➜▼
值不值得做?
- agent 自动改码 · 编译 · 验证一条龙
- 按思路定制用例,输出优化前后对比
收益成本风险
产出 ▸ 优化前后对比报告
对比报告➜▼
回到真实世界创造价值
- 验证通过的方案进入开发排期
- 落地后持续跟踪线上效果
成果 ▸ 商用体验改善闭环
卡片间实线箭头 = 主流程,产出逐级流转 · 虚线回流 = 迭代闭环
↩ 回流迭代:验证不通过 → 回到 ④ 差异分析重新提优化点 | 发现新问题域 → 回到 ① 场景建模重新定义场景
PPT · 第 3 页 · 阶段 ①
同一套骨架(构造 → 触发 → 观测),两种实例化:一个贴近商用体验,一个可控可解释
模型 A真实体验模型
模拟实际用户体验场景
构造启动多个应用并驻留,构造低内存场景
触发在低内存状态下启动相机(目标行为)
观测观测相机启动时延,评估内存性能优劣
端到端贴近商用体验直读
模型 B抽象压力模型
对模型 A 的抽象 · 脚本化、可控
构造脚本加压,可控地构造低内存场景
触发运行内存申请程序,模拟内存申请
观测观测内存申请表现,评估内存性能优劣
变量可控可参数化易归因
抽象的合理性 ▸ 相机启动 ≈ 低内存下的一波集中内存申请;多应用驻留 ≈ 可参数化的脚本压力源
双模型互补 ▸ 模型 A 的结果直接对应商用体验;模型 B 变量可控、易归因 —— 两者互为印证
产出 ▸ 可复现的双负载模型:真实体验模型(A)+ 抽象压力模型(B)
PPT · 第 4 页 · 阶段 ②
2
趋势量化 · 白盒观测框架
执行中内存到底怎么变?
两条采集通道在同一时间轴上对齐 —— 让「发生了什么」与「谁在做」互相解释
输入
负载执行
双负载模型按场景运行
A · 真实体验
多应用驻留 · 相机启动
B · 抽象压力
脚本加压 · 内存申请
➜
白盒观测框架逐时刻 · 时间同步
脚本采集 · 内存微观指标
文件页 / 匿名页回收量回收构成与力度
可用内存量压力水位与走向
refault 率回收质量 · 回收后又回炉
回收效率单位时间有效回收
工具采集 · 调用栈
hiperf采样剖析 · 看谁在消耗
hitrace事件追踪 · 看系统在做什么
➜
内存变化曲线
▼
可视化面板 · 交互式分析
同轴对齐是前提 ▸ 指标与调用栈在同一时间轴采集,曲线任何异常点都能立刻问到「当时谁在跑」
结果指标 × 质量指标 ▸ 回收量、可用内存看「结果」;refault 率、回收效率看「质量」——区分有效回收与无效折腾
产出 ▸ 时间对齐的「指标曲线 × 调用栈」:锁定某时刻性能瓶颈对应的调用栈 —— 阶段 ③ 瓶颈定位的直接输入
PPT · 第 5 页 · 阶段 ③
把「某时刻的异常」串成「贯穿始终的链路」—— 曲线定时刻,调用栈定责任,收敛为关键路径
输入
曲线 × 调用栈
阶段 ② 产出:异常时刻 ↔ 调用栈
➜
①异常段识别
从曲线形态分类异常
②时刻归因
异常点对齐到调用栈
③共现分析
跨异常找公共调用链
关键路径 · 端到端时延分解示意数据 · 相机启动场景
蓝紫 = 非关键环节(可并行 · 非阻塞) | 琥珀 = 关键环节(串行阻塞,决定端到端时延)
具体结论 · 回收文件页(以 Linux 为例)每条结论 = 阶段 ④ 的一个对比点
问题 1热页误逐(refault)
现象 ▸ 回收后的文件页很快被再次访问,缺页读回 —— 回收做了无用功
结论 ▸ 活跃度判定偏保守,高价值缓存被当作冷页逐出
④ 对比 ▸ 热页判定与保护机制
问题 2直接回收阻塞
现象 ▸ 压力来临 kswapd 跟不上,申请任务在关键路径上同步回收
结论 ▸ 串行阻塞是时延主因 —— 即上方瀑布图 56% 环节
④ 对比 ▸ 回收异步化与水位设计
问题 3共享页 unmap 开销
现象 ▸ mapcnt>1 文件页需沿 rmap 逐个摘除映射,页越热开销越大
结论 ▸ 反向映射组织决定回收单价,批量摘除是已知收益点
④ 对比 ▸ 反向映射的组织方式
产出 ▸ 关键路径与具体结论:问题 × 归因 × 对比点 —— 阶段 ④ 差异分析的直接输入
PPT · 第 6 页 · 阶段 ④·上
4
差异分析(上)· 思路:跨系统对比 + 源码归因
别人为什么没这个问题?
抽象模型天生可移植 —— 同一模型在 iOS 复跑,gap 量化后带着关键路径进源码
①模型移植
模型 B 与平台无关:脚本加压 + 内存申请程序,可直接在 iOS 复现(模型 A 绑生态,不可移植)
②iOS 同压测试
同模型 · 同压力档位 · 同口径;微观指标:可用内存 · 回收量 · refault 率 · 回收效率 · 申请时延
③Gap 量化
指标曲线同轴叠加:差在哪个时刻、哪个指标、各差多少 —— 差距定位到具体环节,即 gap
④源码级归因
阶段 ③ 关键路径 × XNU 源码:iOS 用什么机制避开这个问题 —— 差异 → 可借鉴 → 优化方向
Gap 对比示意 · 申请时延 × 压力档位示意数据
带着问题读源码
gap 出现在哪类指标,就看哪类机制:
refault 高 → 读热页判定与保护
时延长尾 → 读压力处理路径(回收 / 压缩 / 换出)
unmap 慢 → 读反向映射组织
为什么用抽象模型跨比 ▸ 真实体验模型绑死自家生态;模型 B(脚本 + 申请程序)任何系统可复现 —— 阶段 ① 的抽象在这一步兑现价值
对比必须同轴 ▸ 同模型、同压力档位、同指标口径 —— 保证 gap 来自机制差异,而不是测量差异
产出 ▸ 对比方法论:可移植模型 + 同轴口径 + 源码归因 —— 已识别差异点见下一页
PPT · 第 7 页 · 阶段 ④·下
4
差异分析(下)· 已识别差异点
别人为什么没这个问题?
围绕阶段 ③ 的三个对比点:iOS(XNU)机制 vs 目标系统 —— 每个差异点推导一条优化方向
| 对比点(来自 ③) | iOS · XNU 做法 | 目标系统做法 | 差异本质 | ➜ 优化方向 |
③ · 问题 1 热页判定与保护 |
权限陷阱收割(REFFAULT / MODFAULT):撤掉页权限,访问即触发陷阱 —— 热页精准可见 |
LRU 链表 + 周期扫描,热冷判定靠统计近似 —— 高价值页被误逐(refault) |
硬件辅助精准识别 vs 软件统计近似 |
访问痕迹式热页识别 |
③ · 问题 2 回收异步化与水位 |
匿名页压缩(compressor)+ jetsam 前置,文件页换出走后台 pager —— 申请路径几乎不同步回收 |
内存不足触发 direct reclaim,申请任务在关键路径上同步回收(瀑布图 56% 环节) |
压力处理离申请路径的远近 |
回收异步化 · 压力前置 |
③ · 问题 3 共享页反映射组织 |
每页 pv 链(PVEP 状态机)+ 页表页粒度 ptd_info —— 可按页表页批量跟踪 / 摘除 |
对象级 rmap:mapcnt>1 沿树遍历、逐 PTE 摘除 —— 页越热共享越广,单价越高 |
页级链 + 批量粒度 vs 对象级树 + 逐个摘除 |
映射摘除批量化(页表页粒度) |
③ 提出对比点
④ 差异点 × 机制归因(本页)
优化方向 × 3
⑤ 可行性验证
产出 ▸ 优化方向清单:热页识别精准化 · 回收异步化与压力前置 · 映射摘除批量化 —— 阶段 ⑤ 可行性验证的直接输入
PPT · 第 8 页 · 阶段 ⑤
5
可行性验证 · 自动化验证 Agent 框架
值不值得做?
优化思路交给 agent:读源码 · 改代码 · 编译 · 定制用例 · 自验证 · 出对比 —— 人只负责判断结论
输入
优化思路
热页识别精准化
回收异步化 · 压力前置
映射摘除批量化
来自阶段 ④ 的方向清单
➜
自动化验证 Agent 框架 · 一条龙执行人只判断结论
验证未通过 / 收益不足 ▸ agent 带对比数据回炉迭代
验证输出 · 优化前后对比示意 · 针对「回收异步化」思路
灰 = 优化前 · 紫 = 优化后 —— 数据为示意,实际由 agent 自动采集并输出报告
用例跟着思路走 ▸ agent 按优化方向定制用例——改热页判定就造会被误逐的访问模式,改异步回收就压申请路径,验证才有的放矢
闭环即免费迭代 ▸ 验证不过,agent 带着对比数据回炉——收益坐实或被证伪,都不浪费人力
产出 ▸ 优化前后对比报告:收益坐实 → 落地;收益不足 → 回炉或放弃 —— 五阶段方法论闭环
PPT · 第 9 页 · 汇总表
五个阶段,五个问题
每个阶段只回答一个问题;上一阶段的产出,就是下一阶段的输入。
| 阶段 | 回答的问题 | 关键动作 | 产出 |
| ① 场景建模 | 测什么才有代表性? | 从商用体验提取典型场景与用户痛点;固化为可复现、可重复执行的负载模型 | 可重复执行的负载模型 |
| ② 趋势量化 | 执行中内存到底怎么变? | 白盒方式逐时刻采集内存统计信息;变化趋势与模型执行阶段精确对齐 | 全程内存变化趋势曲线 |
| ③ 瓶颈定位 | 问题出在哪? | 识别异常段:尖峰 / 持续增长 / 平台期 / 抖动;异常归因到具体流程与机制 | 关键路径与具体结论 |
| ④ 差异分析 | 别人为什么没这个问题? | 针对瓶颈对应流程做竞品横向对比;将做法差异转化为优化点 | 差异点与优化点清单 |
| ⑤ 可行性验证 | 值不值得做? | agent 自动改码 · 编译 · 验证一条龙;按思路定制用例,输出优化前后对比 | 优化前后对比报告 |
PPT · 第 10 页 · 支点
方法论的三个支点
两条回流箭头让流程成为闭环:验证不通过 → 回到差异分析;发现新问题域 → 回到建模。
🔄
可复现
模型把不可控的真实体验,变成实验室里可反复执行、可对照的负载——没有复现,就没有对比。
📊
可观测
白盒逐时刻统计,让"感觉卡 / 感觉涨"变成可量化、可归因的数据曲线。
🎯
有参照
竞品提供外部锚点:差距说明"能到哪",差异提示"怎么到"——避免内部视角自证。
五个阶段串成从真实世界到可落地方案的完整链路:建模管代表性,量化管事实,定位管归因,竞品管方向,验证管取舍。闭环,而非单向流水线。
PPT · 第 11 页 · 结尾
闭环,而非单向流水线
五个阶段 · 五个问题 · 两条回流
谢谢 · Q&A