字节跳动客户端性能优化最佳实践
如果无法正常显示,请先停止浏览器的去广告插件。
1. 字节跳动客户端性能
优化最佳实践
Eric|字节跳动应用开发套件 MARS-APM
研发工程师
2021/11/20
1
2. 1.应用性能优化的方向
2.应用性能监控系统在字节的实践
3.接入应用性能监控全链路版
4. 未来规划
2
2
3. 3
应用性能优化的方向
4. 为什么要做性能优化
迭代、推广
4
4
闪退、卡顿
www.volcengine.com
5. 应用性能优化的方向
5
5
APM
Crash
ANR
支付错误
CPU 95%
稳定性
问题预防
性能
自定义监控
www.volcengine.com
6. 6
应用性能监控系统在字节的实践
7. 火山 APM 监控体系 —— 稳定性监控
CPU Exception
7
7
Disk IO
Other
Crash
OOM
Watchdog
www.volcengine.com
8. 火山 APM 监控体系 —— 稳定性监控
8
8
Crash
www.volcengine.com
9. 稳定性监控 ——Crash
9
9
NSSetUncaughtExceptionHandler()
std::set_terminate()
Last Exception Backtrace
软件异常
Unix Signal
sigaction()
硬件异常
task_set_exception_ports()
www.volcengine.com
10. Crash —— 异步调用栈
10
10
问题:
出错的堆栈是被异步执行的,
无法看到异步操作之前的堆
栈,仅靠此时的调用栈无法
排查问题
www.volcengine.com
11. Crash —— Zombie
11
11
问题:
线上野指针问题上报的 Mach 异常只有实例地址,没有其他有效信息,难以归因
目标:
• 暴露更多野指针问题
• 捕获野指针访问前的实例类以及访问堆栈
• 避免对应用造成其他影响
www.volcengine.com
12. Crash —— 火山 Zombie
dealloc
deallocHandler
Zombie Manager
object
12
12
free object
timeout
memoryWarning
new_message
zombie_
Class
report_exception
www.volcengine.com
13. Crash —— Zombie 方案对比
13
Xcode Zombie 火山 Zombie
线上可用 只能线下调试 可以定位线上问题
问题覆盖度 线下测试覆盖面较小 线上暴露野指针问题,覆盖面广
内存问题 会造成内存泄漏 持有对象,并有释放策略,避免内存问题
野指针归因 可以确定 Zombie 对 可以捕获野指针的访问堆栈以及野指针原
象的类型 本对象的释放堆栈
13
www.volcengine.com
14. Crash —— CoreDump
14
14
发生 Mach 异常时,dump App 的运行状态:线程、寄存器、部分脏内存等
恢复崩溃现场
使用 LLDB 调试
查看堆栈、内存等
使用 CoreDump 分析,解决了某组件存在多年的崩溃问题
使单类型崩溃减少了
98%
全系 App 整体崩溃率下降
8%
www.volcengine.com
15. 火山 APM 监控体系 —— 稳定性监控
15
15
Watchdog
www.volcengine.com
16. 稳定性监控 —— Watchdog
16
16
传送门:字节跳动技术团队 —— 《iOS 稳定性问题治理:卡死崩溃监控原理及最佳实践》
www.volcengine.com
17. Watchdog —— 案例分析
17
17
www.volcengine.com
18. Watchdog —— 案例分析
18
18
www.volcengine.com
19. Watchdog —— 案例分析
19
19
App 卡死 8s 时的主线程调用栈
www.volcengine.com
20. Watchdog —— 案例分析
20
20
App 卡死 35s 时的主线程调用栈
www.volcengine.com
21. Watchdog —— 案例分析
21
21
App 卡死 36s、37s 时的主线程调用栈
www.volcengine.com
22. Watchdog —— 线上效果
22
22
3.5
3
2.5
现在
接入卡死监控
2
1.5
1
0.5
0
普通崩溃
卡死
www.volcengine.com
23. 火山 APM 监控体系 —— 稳定性监控
23
23
OOM
www.volcengine.com
24. 稳定性监控 —— OOM
24
24
• App 更新了版本
• App 发生了崩溃
• 用户手动退出
• 操作系统更新了版本
• App 切换到后台之后进程终止
• 覆盖安装
• Watchdog 崩溃
• 后台启动
• XCTest/UITest 等自动化测试框架驱动
• 应用 exit 主动退出
www.volcengine.com
25. 稳定性监控 —— MemoryGraph
25
25
OOM 线上常见方案为记录内存分配的调用栈,这种方案的弊端
是运行时性能消耗过大
+16
CALayer
MemoryGraph 采用内存快照技术,只在
问题发生时进行信息收集,对 99% 的线上
用户没有任何影响
Heap
_layer
UIView
_viewDelegate
MyViewController
_myContext
CGContext
www.volcengine.com
26. 稳定性监控 —— OOM 方案对比
26
26
传统方案(抓栈) Xcode MemoryGraph 火山 MemoryGraph
内存引用信息 无 有 有
线上可用 是 否 是
性能损耗 性能损耗大 — 99% 用户无性能损耗
子节点信息 无 无 有,可以查看某个对象的所有子节点
路径标记 无 无 有,可以标记不同对象的共性
传送门:字节跳动技术团队 —— 《iOS性能优化实践:头条抖音如何实现OOM崩溃率下降50%+》
www.volcengine.com
27. 火山 MemoryGraph —— 案例分析
27
27
通用信息
类列表
对象列表
引用关系
www.volcengine.com
28. 火山 MemoryGraph —— 案例分析
28
28
VM: CG Raster Data : CoreGraphics 使用到的栅格数据,通常是图片,在重度
使用网络图片的 App 中,该类型 VM 通常是内存使用大头
www.volcengine.com
29. 火山 MemoryGraph —— 案例分析
29
29
www.volcengine.com
30. 火山 MemoryGraph —— 案例分析
30
30
www.volcengine.com
31. 火山 MemoryGraph —— 线上效果
接入后 OOM 崩溃率下降了
31
31
50%+
三个月内 OOM 崩溃率下降了
80%+
www.volcengine.com
32. 火山 APM 监控体系 —— 稳定性监控
CPU Exception
32
32
Disk IO
www.volcengine.com
33. 稳定性监控 —— MetricKit
iOS 14+
异常回调
数据上报
33
后台分析
33
数据展示
www.volcengine.com
34. 火山 APM 监控体系 —— 问题预防
before
34
34
闪退
Crash、ANR
after
执行保护逻辑
上报异常问题
修复异常问题
www.volcengine.com
35. 问题预防 —— 崩溃防护
继续原始逻辑
调用易崩方法
35
35
继续原始逻辑
业务逻辑
防护逻辑
Hook 易崩方法
否
是
判断是否会崩溃
判断是否有 try catch
是
执行保护逻辑
上报问题堆栈
否
防护范围:Unrecognized selector、Container、Notification、
KVO、KVC、NSUserdefaults …
www.volcengine.com
36. 问题预防 —— 卡死保护
36
36
主线程调用
继续原始逻辑
业务逻辑
防护逻辑
Hook 高危 API
否
异步执行
等待超时
是
返回默认值
上报问题堆栈
防护范围:UIPasteboard、UIApplication、YYCache、
NSUserdefaults、CoreLocation…
www.volcengine.com
37. 问题预防 —— 线上收益
37
37
2020 年由于某外部 SDK 后台下发数据出错,引发很多使用方线
上出现大面积崩溃,影响用户众多,当时内部已经接入了崩溃防护,
兜住了
100w+ 量级的崩溃,免受于这场风波。
www.volcengine.com
38. 火山 APM 监控体系
38
稳定性监控 Crash、线上Zombie、CoreDump、
Watchdog、OOM、MetricKit
问题预防 崩溃防护、卡死保护
性能监控 启动分析、页面分析、CPU、电量、
磁盘、网络
自定义监控 自定义异常、事件埋点、自定义日志
38
火山 APM
www.volcengine.com
39. 39
接入应用性能监控全链路版
40. 火山引擎应用开发套件 MARS,免费公测中
火山引擎应用开发套件 MARS,是由字节跳动技术经验的沉淀,经抖音、今日头条等多款 App 研发实践验证、诸多企业使
用的面向多端开发场景的应用研发工具,致力于通过先进的研发技术,帮助企业和用户降低研发成本、聚焦业务成功。
微信扫码关注公众号,点击底部菜单栏“MARS 产品”即可申
请免费试用,如有私部需求也可在公众号内随时与我们联系解决。
www.volcengine.com
41. 41
未来规划
42. 未来规划
42
42
内存问题 MemoryGraph 归因
性能问题归因
多平台联动
……
www.volcengine.com
43. 欢迎加入
4
3
43
扫码关注
“火山引擎开发者社区”公众号
www.volcengine.com
44. www.volcengine.com