写点什么

快手开源自研 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:264990

评论

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

企业API网关适用业务场景

RestCloud

API 网关

如何发布自定义 npm 组件包

数新网络官方账号

前端 npm

软件测试/人工智能|一文教你配置selenium环境

霍格沃兹测试开发学社

新一代“垫图”神器,IP-Adapter的完整应用解读

京东科技技术说

人工智能

数智化重新定义员工体验

用友BIP

数智人力

容器网络Cilium:DualStack双栈特性分析

华为云开发者联盟

云原生 华为云 华为云开发者联盟

用友BIP数智干部管理,落实国有企业人才强企战略

用友BIP

干部管理

数智时代,业财融合如何助力企业数智化转型?

用友BIP

业财融合

华秋DFM荣获第三届智能制造创新大赛全国总决赛-新技术应用赛道三等奖

华秋电子

大模型那么火,教你一键Modelarts玩转开源LlaMA(羊驼)大模型

华为云开发者联盟

人工智能 华为云 华为云ModelArts 大模型 华为云开发者联盟

每日一题:LeetCode-113. 路径总和 II

Geek_4z9ami

面试 算法 LeetCode 二叉树 DFS

软件测试|测试专家(前阿里P8)聊测试职业发展常见瓶颈

霍格沃兹测试开发学社

【腾讯云 HAI域探秘】体验大模型的多种业务应用

Hanson

火眼金睛破局ES伪慢查询 | 京东物流技术团队

京东科技开发者

数据库 慢查询 Elastic Search

软件测试/人工智能|selenium元素定位方式大全

霍格沃兹测试开发学社

「智造」第15期:十问用友TimensionDB时序数据库

用友BIP

时序数据库

数字化商品计划已经Out啦 揭秘哪些国际⼤牌⽤了AI智能商品计划?

第七在线

第七在线引领零售供应链智能化,助力企业实现效能提升

第七在线

喜讯!云起无垠入选“2023年中国AIGC创新企业榜”

云起无垠

如何在编写代码时添加有效的注释?

小魏写代码

软件测试/人工智能|Linux常见面试问题讲解

霍格沃兹测试开发学社

探秘AI赋能的未来世界:CyberAI深度学习技术助力变革

数新网络官方账号

人工智能 大数据

新一代 “垫图” 神器,IP-Adapter 的完整应用解读

京东科技开发者

LED透明屏:私人定制引领新潮潮流

Dylan

广告 时尚产业 LED显示屏 全彩LED显示屏 led显示屏厂家

DFM引领电子产业变革,智能制造助力高效生产

华秋电子

基于Raft算法的DLedger-Library分析 | 京东物流技术团队

京东科技开发者

算法 分布式系统 raft DLedger

HTML5+Canvas数字孪生智慧机房可视化系统

2D3D前端可视化开发

物联网 数字孪生 三维可视化 智慧机房 智慧数据中心

【案例】多渠道管理 第七在线智能计划帮助Calvin Klein业务精准决策

第七在线

DAPP代币燃烧质押系统开发丨详情开发

l8l259l3365

使用 PAI-Blade 加速 StableDiffusion Fine-Tuning

阿里云大数据AI技术

AI

活动预告| 字节跳动基于DataLeap的DataOps最佳实践

字节跳动数据平台

大数据 数据治理 数据安全 数据研发 企业号12月PK榜

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