站长网 资讯 快手自研OOM解决方案KOOM今日公布开源

快手自研OOM解决方案KOOM今日公布开源

近日,快手宣布开源KOOM,成为行业首个开源线上内存溢出(Out of Memory,以下简称OOM)问题解决方案的互联网企业。据介绍,KOOM是在客户端完成内存监控后,将解析报告上传到云端,传输文件大小仅为KB级,运行时用户无感知,对流量基本无影响,适合大规模普及

近日,快手宣布开源KOOM,成为行业首个开源线上内存溢出(Out of Memory,以下简称OOM)问题解决方案的互联网企业。据介绍,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开始对调用系统库做了限制,快手自研

本文来自网络,不代表站长网立场,转载请注明出处:https://www.tzzz.com.cn/html/biancheng/zx/2021/1103/18799.html

作者: dawei

【声明】:站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。
联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部