如何系统性治理 iOS 稳定性问题
如果无法正常显示,请先停止浏览器的去广告插件。
1. 如何系统性治理iOS稳定性问题
丰亚东
字节跳动 Client Infra - APM
2. • Content Title 2
• Content Title 3
• Content Title 4
• Content Title 5
• Content Title 6
3. 自我介绍
2016年4月加入字节跳动,先后负责今日头条App工程架构,基础库和体验优化
等基础技术方向
•
2017年12月至今,专注在APM方向,从0到1全程参与了字节APM中台的建设,
目前主要负责iOS端性能稳定性监控和优化
•
4. • 稳定性问题分类
• 稳定性问题治理方法论
• 疑难问题归因
• 总结回顾
5. 稳定性问题分类
OOM Watchdog
Disk I/O 异常 CPU异常
1%
4%
12%
28%
• 20% 的用户最无法忍受闪退
• 1/3 用户流失会转向竞品
56%
常⻅稳定性问题分类及占比
Crash
6. • 稳定性问题分类
• 稳定性问题治理方法论
• 疑难问题归因
• 总结回顾
7. 稳定性问题治理方法论
能力覆盖
Crash
Watchdog
OOM
治理原则
CPU
Disk I/O
控制新增,治理存量
生命周期覆盖
研发
测试
集成
灰度
上线
先急后缓,先易后难
8. 稳定性问题治理方法论
发现
•
•
•
线上监控
报警
问题分发
归因
•
•
•
单点归因
共性归因
爆发归因
治理
•
•
•
问题防护
动态止损
线下修复
防劣化
•
•
•
机架自动化
系统工具
三方工具
9. • 稳定性问题分类
• 稳定性问题治理方法论
• 疑难问题归因
•
• Crash
• Watchdog
• OOM
• CPU&Disk I/O
总结回顾
10. 疑难问题归因-Crash
Mach 异常 Signal 异常
OC 异常 C++ 异常
17%
18%
5%
•
•
微软称其发布的 70%+ 的安全补丁都是与内存相
关的错误(EXC_BAD_ACCESS)
内部统计表明,线上Crash 80%+ ⻓期没有结论,
而其中 90%+ 都是 Mach 异常或者 Signal 异常
归因难点:
60%
1. 纯系统调用栈
2. 线下复现难
3. 崩溃调用栈可能非第一现场
11. 疑难问题归因-Crash
1. Zombie
Zombie 定义
指的是已经释放的 OC 对象
归因优势
1. 可以直接定位到发生问题的类
2. 可以提高偶现问题的复现概率
适用范围
OC 对象野指针导致的内存问题
12. 疑难问题归因-Crash
object
1. Zombie
dealloc hooked dealloc
any message zombie
object
exception
report
13. 疑难问题归因-Crash
Zombie 开启之前调用栈
1. Zombie
14. 疑难问题归因-Crash
Zombie 开启之后调用栈
1. Zombie
15. 疑难问题归因-Crash
Zombie 对象被释放时调用栈
1. Zombie
16. 疑难问题归因-Crash
问题原因
trick 方案会导致首⻚视图控制器被意
外释放
解决方案
下掉 trick 方案并依赖导航控制器原生
实现决定滑动手势是否能够触发
1. Zombie
17. 疑难问题归因-Crash
2. Coredump
Coredump 定义
lldb 定义的一种特殊文件格式,可以还原 App 运行某一时刻
的完整运行状态
归因优势
1. 结合 lldb 无需复现就可以实现线上疑难问题的事后调试
2. 崩溃现场信息完全还原,海量分析素材
适用范围
任意 Mach 异常和 Signal 异常问题
18. 疑难问题归因-Crash
Crash 调用栈
2. Coredump
19. 疑难问题归因-Crash
Lldb 分析命令
2. Coredump
20. 疑难问题归因-Crash
问题原因
com.apple.CFFileDescriptor 队列外部引用计数<0,过度释放
2. Coredump
21. 疑难问题归因-Crash
2. Coredump
解决方案
替换 dispatch_queue_create 方法在创建队列时使用dispatch_source_create
方式增加CFFileDescriptor队列的外部引用计数
22. • 稳定性问题分类
• 稳定性问题治理方法论
• 疑难问题归因
•
• Crash
• Watchdog
• OOM
• CPU&Disk I/O
总结回顾
23. 疑难问题归因-Watchdog
危害
1. 对用户体验的伤害更大
2. 量级是普通 Crash 的 2-3倍
3. 增加 OOM 崩溃误判概率
归因难点
1. 传统方案容易误报
2. 卡死成因可能是非单一问题
3. 疑似死锁问题的分析⻔槛高
24. 疑难问题归因-Watchdog
优化
1. 多次抓栈并且记录每次主线程的线程状态
2. 如果存在死锁导致的卡死问题,还原出各
线程之间的锁等待关系
25. 疑难问题归因-Watchdog
分析思路:
• CPU 占用为 0, waiting 状态, swapped out -> 疑似死锁
• CPU 占用很高, running 状态 -> 疑似主线程存在死循环等CPU密集型任务
1. 线程状态
26. 疑难问题归因-Watchdog
2. 死锁线程分析
目前覆盖:
"___psynch_mutexwait":Mutex lock
"___psynch_rw_rdlock":ReadWrite lock
"___psynch_rw_wrlock":ReadWrite lock
"___ulock_wait":UnfairLock lock
"_kevent_id":GCD lock
27. 疑难问题归因-Watchdog
死锁线程自动识别
2. 死锁线程分析
28. 疑难问题归因-Watchdog
死锁线程锁等待关系图
2. 死锁线程分析
29. 疑难问题归因-Watchdog
2. 死锁线程分析
问题原因
主线程持有 mutex 锁,等待 GCD 锁;子线程持有 GCD 锁,等待 mutex 锁;互相等待造成死锁
解决方案
主线程与子线程可能的耗时操作尽量不要存在锁竞争关系;block 在串行队列中同步执行要慎用
30. 疑难问题归因-Watchdog
最常⻅触发 Watchdog 原因
死锁
锁竞争
主线程IO
跨进程通信
31. • 稳定性问题分类
• 稳定性问题治理方法论
• 疑难问题归因
•
• Crash
• Watchdog
• OOM
• CPU&Disk I/O
总结回顾
32. 疑难问题归因-OOM
危害:
1. 对重度用户体验的伤害大
2. 量级是普通 Crash 的 3-5倍
3. 快速迭代中很容易劣化
归因难点:
1. 没有明确的调用栈信息
2. 线下工具不适用于线上场景
3. 模拟和复现问题非常困难
33. 疑难问题归因-OOM
MemoryGraph
原理:
在 App 物理内存占用超过危险水位值之后触发
内存 dump,SDK 会记录每个内存节点的符号
化信息和彼此之前的强弱引用关系,最终上报到
后台分析大内存占用和内存泄漏等问题
34. 疑难问题归因-OOM
排查思路:抽丝剥茧,逐步找到root cause
MemoryGraph
35. 疑难问题归因-OOM
MemoryGraph
问题原因 ⻜书图片下载器并发依赖 NSOperationQueue,并未配置最大并发数,极端场景下内存占用过高
解决方案 图片下载器配置最大并发数,并且根据待加载图片是否在可视区域内调整优先级
36. 疑难问题归因-OOM
最常⻅触发 OOM 原因
内存泄漏
内存堆积
资源异常
内存使用不当
37. • 稳定性问题分类
• 稳定性问题治理方法论
• 疑难问题归因
•
• Crash
• Watchdog
• OOM
• CPU&Disk I/O
总结回顾
38. 疑难问题归因-CPU&Disk I/O
危害:
1. 即使不崩溃也容易引发卡顿,设备发烫等问题
2. 量级同样不可忽视
3. 问题隐蔽,比较容易劣化
归因难点:
1. 问题持续时间比较⻓,原因可能非单一
2. 问题复现强依赖用户使用环境和操作路径
3. 用户态监控性能损耗比较高
39. 疑难问题归因-CPU&Disk I/O
CPU resource limit
App.cpu_resource-date.ips:
CPU: 144 seconds cpu time
over 145 seconds (100% cpu
average), exceeding limit of
80% cpu over 180 seconds
40. 疑难问题归因-CPU&Disk I/O
Disk write resource limit
App.diskwrites_resource-date.ips:
Writes: 1073.75 MB of file backed memory
dirtied over 2538 seconds (423.09 KB per
second average), exceeding limit of 12.43 KB
per second over 86400 seconds
41. 疑难问题归因-CPU&Disk I/O
MetricKit
基于 MetricKit 框架,iOS14+ 系统可以很方便获取 CPU 和 Disk I/O 异常归因信息
42. 疑难问题归因-CPU&Disk I/O
MetricKit
上报数据可视化为直观的火焰图
问题原因
⻜书小程序业务一个动画在隐藏
时并未暂停
解决方案
动画在隐藏时暂停
43. • 稳定性问题分类
• 稳定性问题治理方法论
• 疑难问题归因
• 总结回顾
44. 总结回顾
发现
归因
Zombie
线程状态
Memory
治理
防劣化
Coredump 死锁分析
Crash Watchdog
Graph
OOM
MetricKit
CPU&Disk I/O
45. 火山引擎 MARS-APM 全链路版
30天免费试用中
APMPlus 是火山引擎应用开发套件 MARS 下的性能监控产品,通过先进的数据采集与监控
技术,为企业提供全链路的应用性能监控服务,解决企业对各端监控的需求。具备非侵入式
监控、丰富的异常现场还原能力,助力企业提升异常问题排查与解决的效率、优化应用品
质,以降低成本提高收入。
微信扫码关注公众号,点击底部菜单栏“MARS产品”即可申请免费
试用,如有私部需求也可在公众号内随时与我们联系解决。
46.
47.