写点什么

快手开源自研 OOM 解决方案 KOOM

  • 2020-08-12
  • 本文字数:1700 字

    阅读完需:约 6 分钟

快手开源自研OOM解决方案KOOM

近日,快手宣布开源自研 OOM 解决方案KOOM。据了解,KOOM 是在客户端完成内存监控后,将解析报告上传到云端,传输文件大小仅为 KB 级,运行时用户无感知,对流量基本无影响,适合大规模普及应用,目前该方案已在快手全量业务中应用,OOM 率降低了 80%以上,效果显著。


OOM 是当前 Android 开发中的常见疑难问题,尤其是线上发生的 OOM 问题极难定位。业界当前最知名的方案 LeakCanary,通过监控 Activity/Fragment 泄漏优化 Java OOM 问题,多年来一直为广大 App 保驾护航,解决了 OOM 治理从 0 到 1 的问题。但面对行业不断复杂的业务环境和庞大用户流量,LeakCanary 仍有优化空间:受限于性能,无法在线上大规模部署,仅支持线下使用;只能定位 Activity&Fragment 泄漏,无法定位大对象、频繁分配等问题;需要人工一一分析,无法对问题聚类量化……为了彻底解决 OOM 问题,行业尝试了多种解决方案,通常是基于 LeakCanary 做优化,但至今没有能完全解决监控过程中的性能问题,普遍解决方法是通过采样的办法牺牲一小部分用户的体验来定位问题。


快手 OOM  Killer 沿用行业的研究思路,针对 LeakCanary 无法解决的难题进行自研改造,充分发挥 LeakCanary 原有优势的同时补足短板,打造了一套可以线上部署、兼顾线下、配置灵活、适用范围广泛、高度自动化,埋点、监控、解析、上报、分发、跟进、报警一站式服务的闭环监控系统,将绝大多数 OOM 问题拦截在灰度阶段,彻底解决了 OOM 问题。



KOOM 框架


快手 KOOM 核心流程包括:配置下发决策、监控内存状态、采集内存镜像、解析镜像文件(以下简称 hprof)生成报告并上传、问题聚合报警与分配跟进。

无主动触发 GC 不卡顿

之前行业的普遍做法是通过在 Activity.onDestroy()后连续触发两次 GC,并检查引用队列,判定 Activity 是否发生了泄漏,但频繁 GC 会造成用户可感知的卡顿,快手为实现无感触发设计了全新的监控模块,通过无性能损耗的内存阈值监控来触发镜像采集。将对象是否泄漏的判断延迟到了解析时,阈值监控只要在子线程定期获取关注的几个内存指标即可,性能损耗忽略不计。



内存监控流程图

高性能镜像 DUMP

采集内存镜像传统方案会造成应用完全冻结长达几秒,期间用户完全不能操作,严重损害用户体验。快手利用系统内核 COW(Copy-on-write,写时复制)机制,每次 dump 内存镜像前先暂停虚拟机,然后 fork 子进程来执行 dump 操作,父进程在 fork 成功后立刻恢复虚拟机运行,整个过程对于父进程来讲总耗时只有几毫秒,对用户完全没有影响。


暂停虚拟机需要调用虚拟机的 art::Dbg::SuspendVM 函数,谷歌从 Android 7.0 开始对调用系统库做了限制,快手自研了 kwai-linker 组件,通过 caller address 替换和 dl_iterate_phdr 解析绕过了这一限制。



Fork dump hprof 流程图

“不偷”用户流量的解决方案

传统方案得到的 hprof 文件通常比较大,占用用户大量磁盘空间,上传大文件浪费用户流量,且不利于问题聚类分析。快手采用了新的思路:采用边缘计算的思路,将内存镜像于闲时进行独立进程单线程本地分析,不过多占用系统运行时资源;分析完即删除,不占用磁盘空间;分析报告大小只有 KB 级别,不浪费用户流量。


分析报告生成流程总体分为三个环节,第一个环节扫描镜像构建索引,建立泄露查找分析的基础;第二个环节查找出泄露的对象,根据既有的 framework 知识以及人为设定的策略,执行对象泄露判定;第三个环节生成最终报告文件,将对象泄露路径、泄露数量、类统计、运行时信息添加至报告文件,辅助后续根据报告分析解决 OOM 问题。



解析镜像生成报告流程图


针对镜像回捞需求,对 hprof 进行运行时 hook 裁剪,只保留分析 OOM 必须的数据。裁剪还有数据脱敏的好处,只保留对分析问题有用的内存中类与对象的组织结构,并不上传真实的业务数据,充分保护用户隐私。

总结展望

快手 KOOM 计划做完整的客户端内存解决方案,开发者可以通过接入 KOOM,解决自己项目中的 OOM 问题。此次一期开源暂时只包括 Android Java OOM 解决方案,后续还将开源 Android 线程/文件描述符监控、Android Native OOM 监控、iOS OOM 监控等,最终实现帮助开发者解决各种场景下 OOM 的愿景。

项目地址:

https://github.com/KwaiAppTeam/KOOM


2020-08-12 15:264544

评论

发布
暂无评论
发现更多内容

1024程序员节致敬鸿蒙开发者:鸿蒙生态一日千里的幕后英雄

最新动态

生产管理系统(源码+文档+部署+讲解)

深圳亥时科技

“0元购”智元灵犀X1机器人,软硬件全套图纸和代码全公开,加速人形机器人技术革新!

Geek_2d6073

极狐GitLab 发布安全版本16.10.10, 16.9.11, 16.8.10, 16.7.10

极狐GitLab

ruby gitlab 安全漏洞 升级

极狐GitLab 17.5 重点功能解读,可以升级啦!

极狐GitLab

gitlab 版本发布

用户信息管理系统

深圳亥时科技

Neural Filters for Photoshop 2021(ps2021逆天滤镜库)无需登陆Adobe Id

理理

AE高级辉光特效插件 Deep Glow for mac 安装教程

理理

在After Effects上的快速输出GIF动图格式插件:GifGun for Mac

理理

交互管理系统

深圳亥时科技

用户管理系统(源码+文档+部署+讲解)

深圳亥时科技

2024 年金九银十版Java面试题及答案整理(纯干货,超详细)

采菊东篱下

编程 java面试

员工信息管理系统

深圳亥时科技

优秀的AE人像磨皮润肤美容插件 beauty box

理理

Python + OpenTelemetry,观测你的特斯拉!

Greptime 格睿科技

Python 数据库 云原生 数据监控 观测

捷途旅行者与丰田RAV4荣放的品牌策略差异

科技热闻

鸿蒙团队1024程序员节致敬开发者:同心协力,共码未来

最新动态

寻找AI新势力!“天翼云息壤杯”高校AI大赛火热报名中!

天翼云开发者社区

人工智能 AI

ElevenLabs Voice Design :可通过文本创建个性化语音;苹果推出首个开发者测试版丨 RTE 开发者日报

声网

数据驱动决策,实时监控助力电商新飞跃 —— 深度解析淘宝商品详情API的应用实践

代码忍者

API 接口 pinduoduo API

处理数码相机RAW格式文件 Adobe Camera Raw

理理

分销管理系统(源码+文档+部署+讲解)

深圳亥时科技

AE镜头光晕插件 Optical Flares for Mac 许可证及安装包

理理

PS一键磨皮插件Delicious Retouch for mac+DR5预设教程

理理

Nik Collection 6 for Mac(PS滤镜插件套装) v6.1.0中文激活版

理理

Video Copilot Element 3D for Mac(AE三维模型插件) 破解许可证

理理

智慧考务管理系统

深圳亥时科技

道路养护系统(源码+文档+部署+讲解)

深圳亥时科技

永久激活版 Trapcode Particular for Mac(AE三维粒子插件)

理理

1024 | 码客聚会,云上跃迁,探秘华为云和他的开发者朋友们的故事

华为云开发者联盟

HarmonyOS 1024程序员节 鲲鹏计算 昇腾 #人工智能

项目管理系统(源码+文档+部署+讲解)

深圳亥时科技

快手开源自研OOM解决方案KOOM_架构_快手技术_InfoQ精选文章