如何系统性治理 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.

首页 - Wiki
Copyright © 2011-2024 iteam. Current version is 2.137.1. UTC+08:00, 2024-11-23 19:48
浙ICP备14020137号-1 $访客地图$