手淘IOS性能优化探索
2020-03-01 319浏览
- 1.⼿手淘iOS性能优化探索 ⼿手淘基础架构 — ⽅方颖(叁省)
- 2.我们面对的每一天~~ 怎么一个版本一个版 本性能越来越差了~~~ 页面加载这么慢 都不知道吗~~~ xxx~~~ 线上页面加载数据怎么这么卡~~~ 有很多客户投诉,页面划不动啊~~~ xxx~~~ xxx~~~ ~~~ xx~~~ ~~~ 一脸懵逼~~~ 启动不达标,不达标~~~
- 3.性能面对的问题 研发流程如何自 动防止性能衰退 线上问题 如何排查 性能如何度量 性能监控是否能真实 反映用户体验 版本质量 如何保证 架构如何 支撑性能
- 4.技术上从研发流程角度的思考 研发 研发 架构⽀支撑 • App启动器 集成 性能度量量 排查 线上问题
- 5.研发架构沉淀 — App启动器设计目标 问题篇: 1. 启动过程任务数量多,并且复杂/凌乱 2. 版本持续迭代,启动任务任意增加,维护成本高 3. 启动性能不宜被管控,未知任务容易导致性能下降 4. 稳定性容易受到挑战,任意加入启动逻辑,可能造出闪退 5. 启动过程业务逻辑严重耦合 设计目标: 1. 采取配置信息,解决耦合问题,达到启动任务松耦合 2. 启动任务细粒子化,通过高并发设计、自学习最佳任务顺序,提高启动性能 3. 启动任务服务端可配置,保证线上问题服务端控制解决 4. 启动任务严格管控,业务任务接入需要接受审核
- 6.研发架构沉淀 — App启动器
- 7.研发架构沉淀 — App启动器的效果 1.代码优化 1.1 多线程锁优化 1.2 逻辑数据NSCoding镜像化 1.3 load 卡口 2. 细粒度任务接入并发串行任务管理 1. 部分代码持续优化 横轴: 手淘版本号 纵轴: 启动耗时2秒用户占比 1. 自学习最优启动任 务顺序功能关闭 1.智能启动器上线 2. 并发串行任务管理上线 1. 细粒度任务接入并发串行任务管理 1.1 首页任务拆分与接入 2. 首页图片非编码数据缓存与mmap缓存
- 8.技术上从研发流程角度的思考 集成 集成 数据卡⼝口 研发 研发 架构⽀支撑 • • API使用卡口 性能维度卡口 性能度量量 线上问题
- 9.集成数据卡口 — 非最佳使用API卡口案例
- 10.集成数据卡口 — 非最佳使用API卡口案例
- 11.集成数据卡口 — 非最佳使用API卡口案例 如何去统计和定位App load函数的耗时? 初始化依赖动态库 初始化mainExec静态库
- 12.集成数据卡口 — 非最佳使用API卡口案例 如何去统计和定位App load函数的耗时? 内部执⾏行行 load ⽅方法 综合结论:动态库load⽅方法调⽤用,早与主⼆二进制所有load⽅方法调⽤用
- 13.集成数据卡口 — 非最佳使用API卡口案例 如何去统计和定位App load函数的耗时?
- 14.集成数据卡口 — 非最佳使用API卡口案例 监控C++静态对象构造函数和__attribute_((constructor))的耗时? TYPE==S_MOD_INIT_FUNC_POINTERS 对应Mach-O⽂文件中具体的section段
- 15.集成数据卡口 — 非最佳使用API卡口案例 监控C++静态对象构造函数和__attribute_((constructor))的耗时? 实验1 0 _TEXT段 1 2 0 1 2
- 16.集成数据卡口 — 非最佳使用API卡口案例 监控C++静态对象构造函数和__attribute_((constructor))的耗时? 实验2 1 2 1 实验结论: • __attribute__((constructor))修饰函数的个数与 section __mod_init_func端funciton pointers个数一致 • C++静态对象构造函数虽然无法统计出每个具体函数的 耗时,但是可以统计出具体对应某个.o中全部静态对象 构造函数的耗时 • Section __mod_init_func是在DATA段(该段可以动 态修改),function pointers指向的区域是TEXT段 (该段无权限修改) 2
- 17.集成数据卡口 — 非最佳使用API卡口案例 监控C++静态对象构造函数和__attribute_((constructor))的耗时?
- 18.技术上从研发流程角度的思考 研发 研发 架构⽀支撑 性能 性能度量量 ⽆无痕度量量 集成 集成 数据卡⼝口 • • • • 启动&页面加载监控 FPS监控 内存监控 CPU监控 线上问题
- 19.无痕性能度量SDK — 常见页面加载耗时度量 启动耗时 ⻚页⾯面加载耗时
- 20.无痕性能度量SDK — main函数前系统做了啥? app启动起点:动态framework的 class load⽅方法调⽤用时机
- 21.无痕性能度量SDK — viewDidAppear后页面展示了吗? 异步回调? 异步渲染?
- 22.无痕性能度量SDK — 用户真正看到页面是啥时候呢? 如何才能判断屏幕渲染完成??? 是否能间接获取出屏幕渲染完成时间???
- 23.无痕性能度量SDK — 基于用户体验页面加载完成度量思路
- 24.无痕性能度量SDK — 屏幕渲染采样耗时测试数据 不同机型10次实验数据结果图 不同机型1次实验数据结果图
- 25.无痕性能度量SDK — 基于用户体验页面加载度量方式的测试结果
- 26.技术上从研发流程角度的思考 研发 研发 架构⽀支撑 集成 集成 数据卡⼝口 性能 性能度量量 ⽆无痕度量量 线上 线上问题 排查⼯工具 • • 主线程卡顿监控 instrument 工具
- 27.线上性能排查工具—instrument苹果给开发人员的神器 To a force of English
- 28.线上性能排查工具—instrument苹果给开发人员的神器 To a force of English 如果对于线上app有类似的time profile工具就好了
- 29.线上性能排查工具—自制instrument的思路 To a force of English
- 30.线上性能排查工具—tbinstrument 淘宝的instrument To a force of English
- 31.线上性能排查工具—tbinstrument 淘宝的instrument To a force of English
- 32.线上性能排查工具 — tbinstrument 案例 To a force of English • 排查问题case A IO是性能问题原因
- 33.线上性能排查工具 — tbinstrument 案例 To a force of English • 排查问题case B 主线程CPU消耗低?? 子线程CPU消耗高??
- 34.线上性能排查工具 — tbinstrument 案例 To a force of English • 排查问题case B 主线程正常函数调⽤用,耗时⽐比⼀一般 耗时都要⾼高 ⼦子线程有⼤大量量运⾏行行时函数调⽤用,每个耗时 都⽐比正常使⽤用要⾼高。由于⼤大量量调⽤用导致整 体耗时很⾼高,并且占⽤用⽐比较⼤大的CPU
- 35.线上性能排查工具 — tbinstrument 案例 To a force of English • 排查问题case B OC方法消息分发 objc_msgSend内部有runtimeLock锁 runtimeLock 全局锁
- 36.线上性能排查工具 — tbinstrument 案例 To a force of English • 排查问题case B OC runtime相关函数内部执行,也有runtimeLock锁
- 37.线上性能排查工具 — tbinstrument 案例 To a force of English • 排查问题case B 主线程CPU消耗低?? 子线程CPU消耗高?? 结论:runtimeLock 全局锁导致性能瓶颈 A. 主线程正常函数调⽤用,运⾏行行时oc基于objc_msgSend 消 息⽅方法内部遇到runtimeLock锁 B. ⼦子线程oc runtime api频发循环调⽤用,runtime api内部 遇到runtimeLock锁
- 38.技术上从研发流程角度的思考 研发 研发 架构⽀支撑 集成 集成 数据卡⼝口 性能 ⽆无痕度量量 线上 排查⼯工具
- 39.手淘技术微信公众号 - MTT 我们是一支敢玩、敢想、敢拼、热爱生活的队伍 如果您想翘起地球,我们为您提供支点 fangying.fy@alibaba-inc.com
- 40.Thanks!