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 页 · 总览
📥 输入 · 商用体验 —— 真实用户场景 · 使用痛点 · 线上反馈
▼
1

场景建模

测什么才有代表性?
  • 从商用体验提取典型场景与用户痛点
  • 固化为可复现、可重复执行的负载模型
场景提取负载固化可复现
产出 ▸ 可重复执行的负载模型
模型➜▼
2

趋势量化

执行中内存到底怎么变?
  • 白盒方式逐时刻采集内存统计信息
  • 变化趋势与模型执行阶段精确对齐
白盒采集逐时刻阶段对齐
产出 ▸ 全程内存变化趋势曲线
趋势曲线➜▼
3

瓶颈定位

问题出在哪?
  • 识别异常段:尖峰 / 持续增长 / 平台期 / 抖动
  • 异常归因到具体流程与机制
异常识别归因分析
产出 ▸ 关键路径与具体结论
关键路径➜▼
4

差异分析

别人为什么没这个问题?
  • 针对瓶颈对应流程做竞品横向对比
  • 将做法差异转化为优化点
竞品对比差异转化
产出 ▸ 差异点与优化点清单
优化点➜▼
5

可行性验证

值不值得做?
  • agent 自动改码 · 编译 · 验证一条龙
  • 按思路定制用例,输出优化前后对比
收益成本风险
产出 ▸ 优化前后对比报告
对比报告➜▼
✓

优化方案落地

回到真实世界创造价值
  • 验证通过的方案进入开发排期
  • 落地后持续跟踪线上效果
成果 ▸ 商用体验改善闭环
验证不通过 · 迭代优化点 发现新的问题域 · 回到建模重新定义场景

卡片间实线箭头 = 主流程,产出逐级流转  ·  虚线回流 = 迭代闭环

↩ 回流迭代:验证不通过 → 回到 ④ 差异分析重新提优化点 | 发现新问题域 → 回到 ① 场景建模重新定义场景

PPT · 第 3 页 · 阶段 ①
1
场景建模 · 双负载模型
测什么才有代表性?

同一套骨架(构造 → 触发 → 观测),两种实例化:一个贴近商用体验,一个可控可解释

模型 A真实体验模型
模拟实际用户体验场景
构造启动多个应用并驻留,构造低内存场景
触发在低内存状态下启动相机(目标行为)
观测观测相机启动时延,评估内存性能优劣
端到端贴近商用体验直读
抽象
➜
模型 B抽象压力模型
对模型 A 的抽象 · 脚本化、可控
构造脚本加压,可控地构造低内存场景
触发运行内存申请程序,模拟内存申请
观测观测内存申请表现,评估内存性能优劣
变量可控可参数化易归因
抽象的合理性 ▸ 相机启动 ≈ 低内存下的一波集中内存申请;多应用驻留 ≈ 可参数化的脚本压力源
双模型互补 ▸ 模型 A 的结果直接对应商用体验;模型 B 变量可控、易归因 —— 两者互为印证
产出 ▸ 可复现的双负载模型:真实体验模型(A)+ 抽象压力模型(B)
PPT · 第 4 页 · 阶段 ②
2
趋势量化 · 白盒观测框架
执行中内存到底怎么变?

两条采集通道在同一时间轴上对齐 —— 让「发生了什么」与「谁在做」互相解释

输入

负载执行

双负载模型按场景运行

A · 真实体验
多应用驻留 · 相机启动

B · 抽象压力
脚本加压 · 内存申请

➜
白盒观测框架逐时刻 · 时间同步

脚本采集 · 内存微观指标

文件页 / 匿名页回收量回收构成与力度
可用内存量压力水位与走向
refault 率回收质量 · 回收后又回炉
回收效率单位时间有效回收

工具采集 · 调用栈

hiperf采样剖析 · 看谁在消耗
hitrace事件追踪 · 看系统在做什么
➜

内存变化曲线

低内存阶段 ●可用内存 ●回收量 时间 →
▼

可视化面板 · 交互式分析

t₀ · 异常时刻 曲线选点 ⇄ 调用栈联动高亮
同轴对齐是前提 ▸ 指标与调用栈在同一时间轴采集,曲线任何异常点都能立刻问到「当时谁在跑」
结果指标 × 质量指标 ▸ 回收量、可用内存看「结果」;refault 率、回收效率看「质量」——区分有效回收与无效折腾
产出 ▸ 时间对齐的「指标曲线 × 调用栈」:锁定某时刻性能瓶颈对应的调用栈 —— 阶段 ③ 瓶颈定位的直接输入
PPT · 第 5 页 · 阶段 ③
3
瓶颈定位 · 关键路径分析
问题出在哪?

把「某时刻的异常」串成「贯穿始终的链路」—— 曲线定时刻,调用栈定责任,收敛为关键路径

输入

曲线 × 调用栈

阶段 ② 产出:异常时刻 ↔ 调用栈

➜
①异常段识别
从曲线形态分类异常
尖峰增长平台抖动
②时刻归因
异常点对齐到调用栈
异常点 ↔ 栈段高亮
③共现分析
跨异常找公共调用链
公共段 = 嫌疑链
关键路径 · 端到端时延分解示意数据 · 相机启动场景
端到端 80ms 资源加载 12ms 申请 8ms 同步回收 · 压缩 45ms ⚠ 初始化 15ms t₀ t₁ 缺页等待 触发同步回收 页面压缩 / 换出 内存就绪 · 继续 ➜➜➜ 45 / 80ms ≈ 56% 关键环节 · 优化主攻点

蓝紫 = 非关键环节(可并行 · 非阻塞) | 琥珀 = 关键环节(串行阻塞,决定端到端时延)

具体结论 · 回收文件页(以 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 对比示意 · 申请时延 × 压力档位示意数据
目标系统 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 框架 · 一条龙执行人只判断结论
读源码 · 定位

理解现有实现
锁定改动点

实施优化

按优化思路
修改代码

自动编译

构建模块
与镜像

用例生成

按思路定制
验证用例

验证 · 对比

自验证
before / after

验证未通过 / 收益不足 ▸ agent 带对比数据回炉迭代
验证输出 · 优化前后对比示意 · 针对「回收异步化」思路
申请时延 P99
80ms
45ms
▼ 44%
refault 率
8.2%
3.1%
▼ 62%
关键环节占比
56%
28%
▼ 50%

灰 = 优化前 · 紫 = 优化后 —— 数据为示意,实际由 agent 自动采集并输出报告

用例跟着思路走 ▸ agent 按优化方向定制用例——改热页判定就造会被误逐的访问模式,改异步回收就压申请路径,验证才有的放矢
闭环即免费迭代 ▸ 验证不过,agent 带着对比数据回炉——收益坐实或被证伪,都不浪费人力
产出 ▸ 优化前后对比报告:收益坐实 → 落地;收益不足 → 回炉或放弃 —— 五阶段方法论闭环
PPT · 第 9 页 · 汇总表

五个阶段,五个问题

每个阶段只回答一个问题;上一阶段的产出,就是下一阶段的输入。

阶段回答的问题关键动作产出
① 场景建模测什么才有代表性?从商用体验提取典型场景与用户痛点;固化为可复现、可重复执行的负载模型可重复执行的负载模型
② 趋势量化执行中内存到底怎么变?白盒方式逐时刻采集内存统计信息;变化趋势与模型执行阶段精确对齐全程内存变化趋势曲线
③ 瓶颈定位问题出在哪?识别异常段:尖峰 / 持续增长 / 平台期 / 抖动;异常归因到具体流程与机制关键路径与具体结论
④ 差异分析别人为什么没这个问题?针对瓶颈对应流程做竞品横向对比;将做法差异转化为优化点差异点与优化点清单
⑤ 可行性验证值不值得做?agent 自动改码 · 编译 · 验证一条龙;按思路定制用例,输出优化前后对比优化前后对比报告
PPT · 第 10 页 · 支点

方法论的三个支点

两条回流箭头让流程成为闭环:验证不通过 → 回到差异分析;发现新问题域 → 回到建模。

🔄
可复现

模型把不可控的真实体验,变成实验室里可反复执行、可对照的负载——没有复现,就没有对比。

📊
可观测

白盒逐时刻统计,让"感觉卡 / 感觉涨"变成可量化、可归因的数据曲线。

🎯
有参照

竞品提供外部锚点:差距说明"能到哪",差异提示"怎么到"——避免内部视角自证。

五个阶段串成从真实世界到可落地方案的完整链路:建模管代表性,量化管事实,定位管归因,竞品管方向,验证管取舍。闭环,而非单向流水线。

PPT · 第 11 页 · 结尾
闭环,而非单向流水线
五个阶段 · 五个问题 · 两条回流
谢谢 · Q&A