前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >首次揭秘,快手自研性能监控系统开源项目KOOM

首次揭秘,快手自研性能监控系统开源项目KOOM

作者头像
深度学习与Python
发布2021-03-30 16:51:32
1.1K0
发布2021-03-30 16:51:32
举报

嘉宾:薛秋实

编辑:马红伟

随着用户数量扩大,业务不断发展,移动端技术也在突飞猛进中暴露出了诸多“疑难杂症”,比如应用的稳定性如何保障、性能如何提升等等,都是移动端领域需要重点攻克的技术方向。

“以我在快手的工作经验来看,开发效率是当前移动端开发所面临的最大的问题,这体现在多个方面,如业务复杂度和代码量指数级提升,线上同时有上千个 A/B 测试,庞大的工作量造成开发同学很难写出足够健壮的代码,经常会出现千奇百怪的 bug。而要高效的完成大量开发任务,则对架构设计、CI/CD 基础设施建设、基础库的质量和代码防劣化等等都提出了很高的要求;另一方面是动态化,目前快手单周迭代已经是业内比较极限的发版速度了,依然很难满足大型运营活动的需求,目前业内还没有比较完美的统一解决方案,要结合业务场景选用合适的方案。”薛秋实说。

本篇文章中,InfoQ 采访到快手客户端团队稳定性负责人薛秋实,就“疑难杂症”之一的稳定性治理进行深入探讨,而稳定性治理中尤以 OOM 为重中之重,薛秋实会介绍快手在 OOM 治理方面的实践和思考。此外,相关的技术案例也将会在 5 月 29-31 日 QCon 全球软件大会 2021 ·北京站上进行分享。

1快手自研的线上内存监控体系解决了哪些“顽疾”?

InfoQ:为什么快手选择自研 KOOM?KOOM 主要解决了哪些技术问题?

薛秋实:客户端的稳定性治理中,OOM 是最难解决的。一般的崩溃问题,只要获取崩溃瞬时的数据(比如异常类型、堆栈等)就可以解决,而 OOM 往往是多个因素累加在一起形成的,并且和用户使用的过程有很大关系。在没有成熟的线上内存监控体系时,我们只能采用线下复现的方式,效率非常低下且完全不能满足需求,业内也没有开源的成熟方案。

在此背景下,我们决定集中力量自研一套线上内存监控体系。这套体系最大的难点在于监控本身的性能保障问题,由于要在生产环境中采集内存数据(比如 Java 的内存镜像,Malloc/Free 的堆栈等等),非常耗性能,严重影响用户体验。经过大量的优化,KOOM 解决了各种技术难题,做到了相关信息采集下用户无感知的水平。

InfoQ:KOOM 落地成果如何?在研发过程中遇到过哪些挑战?

薛秋实:项目一期上线后基本解决了 Java OOM 的线上定位问题,线上实时采集,并通过服务器聚合头部问题,实现自动分发,直达相关业务开发同学,非常高效,虽然还有很多细节有待完善,但总体效果符合预期。项目中最大的挑战是解决采集内存镜像的性能问题,这一部分用传统做法是完全无法绕过的,采集一次会冻结整个 App 进程 10s 以上,最终通过子进程采集的方案将采集造成的卡顿降低到了几十毫秒,基本做到了用户无感知,这也是整个方案最核心的部分。

InfoQ:KOOM 有哪些具体的实践吗?

薛秋实:我有幸参与了 2020 和 2021 两年的春节活动,这个经历非常难得,期间遇到了很多平时难以想象的技术挑战,经过多个团队的通力合作和艰苦奋战,解决了一个又一个难题,活动取得了理想的效果,个人获得了很多成长,很有成就感。

出于保密需求,春节活动是无法做大规模的线上灰度的,出了问题也没有重新发版补救的机会,成败就在活动开始的一瞬间,是“一锤子买卖”,给稳定性保障提出了很多非常规的挑战。在内存方面,我们预先做了很多降级方案,安排了多轮内测和公测,在这些测试中,通过线上开关控制 KOOM 监控采样率和触发监控的阈值,收集到了一些内存泄漏和不合理的大对象使用,有力的保障了用户体验。

InfoQ:在 OOM 的治理层面,如果其他团队也想实践,有哪些经验和建议可以给大家分享一下?

薛秋实:我们认为 OOM 治理是业界共同的难题,KOOM 取得的一点进展对行业是具有普遍价值的,因此我们选择将其进行开源,可以切实帮助大家解决一些问题,并起到抛砖引玉的作用,吸引大家共同来解决 OOM 问题,同时我们在方案调研阶段也参考了业内大量的优秀方案,学到了很多东西,反馈开源社区是自然而然的。

我们的愿景是将 KOOM 做成一套客户端内存问题整体解决方案,目前只有 Java OOM 部分开源了出来,未来会逐步开源 Native 内存、线程、fd、iOS 内存等部分。移动端 OOM 治理这两年有井喷之势,不论是谷歌 / 苹果官方,还是业内的一些大厂,都在不断贡献优秀的方案出来,建议大家可以多关注业内的进展,以及一些高质量的开源项目,比如谷歌的 Perfetto,当然也包括 KOOM。

我们今年的重点就是持续完善 KOOM,包括我上面提到的 Native 内存、线程、fd、iOS 内存等等,内存治理虽然看到了一些曙光,但离最终取得胜利还有很长的一段路要走,需要付出很多艰辛的努力。

2移动开发被唱衰?选好方向很重要

InfoQ:移动开发被唱衰,您怎么看?

薛秋实:行业发展一般会经历萌芽、成长、成熟、衰退几个阶段,在我看来,移动开发刚刚进入成熟期,且会持续很长一段时间,还是有很多机会的。这里有一点值得注意,行业的技术人才、技术解决方案和技术话语权在迅速向头部公司集中,对开发者的技能要求也在提高,供需结构性矛盾增加,一方面公司招不到合适的人,另一方面开发者感觉求职越来越难。因此开发者需要持续学习,适应行业的发展。

InfoQ:移动端目前最火热的两个操作系统依旧是安卓和 iOS,在治理层面它们有哪些通用的办法吗?

薛秋实:Runtime 层的内存管理,Java 用的是可达性分析,OC 用的是引用计数,差别是比较大的,不过到了 C/C++ 层,二者都是类 Unix 系统,很多底层 API 语义都是一致的,编译工具链也在逐渐靠拢,因此不论是遇到的问题,还是解决方案,都有很多相通的地方。我们双端在一个团队里,设计方案的时候会互相借鉴,并尽可能复用基础设施。

InfoQ:移动端开发人员如果想要在这个领域走出一条成功的路,应该重点发展哪些能力?

薛秋实:一方面要打好基础,这就好比武侠小说里的内功和外功,只有打好根基,才能走的稳,走的远,像郭靖起初练功很笨拙,进展缓慢,但有赖于全真教内功基础扎实,厚积薄发,遇到名师指点后很快就成长为一名一流高手。计算机行业虽然日新月异,但是依然有可以终身受益的“内功”,比如操作系统、算法、编译原理等等,很多经典知识的内核是不变的,学好后可以触类旁通。另一方面则要找到自己的优势,普通人的精力是很有限的,不可能做到样样精通,选择一个自己擅长且对团队有价值的方向深入钻研,就可以成为团队的核心成员,为自己的职业发展构筑很深的护城河。

InfoQ:您曾在三星、乐视任系统工程师,那从系统到客户端,这个转变的过程中有碰到哪些困难吗?如何克服的?

薛秋实:最开始确实很不适应。系统开发的周期很长,发版是以双月为单位的,发布也很重,需要用户做 OTA,一旦有问题可能导致用户手机直接变砖。此外系统底层模块和业务无关,提供的都是基础能力,不存在“绕过”的选项,遇到问题就要实打实的解决,并且解决方案要力求完美,遇到的一些低概率问题都要调集大量的人力做复现和排查。

而客户端开发节奏快,以快手来说是单周迭代,遇到问题要快速响应,同时 App 的发布相对轻量级,可以通过 AB 测试和灰度发布来评估线上的影响范围,还可以通过热修复等方法及时止损,在问题处理上相对灵活。另一点重要区别是 App 的权限和系统相差很大,很多信息 App 很难获取,比如 CPU 的负载、系统日志等等,且系统开发时 ROM 源码是可修改的,想做一些埋点或新增一些功能时可以直接修改系统代码,但 App 不能修改系统代码,需要用 hook 等技术支持,比如做告警监控时需要对 Binder 调用做全局 hook 。

尽管系统和 App 解决问题的思路和方式截然不同,但对技术的要求都是类似的,都需要多阅读系统源码,深入了解其原理和实现,才能达成庖丁解牛的效果,找到合适的解决方案。只要思路转变过来了,在系统侧积累的经验和能力是可以很快在 App 侧发挥巨大作用的。

嘉宾简介:

薛秋实,快手客户端团队稳定性负责人,曾在三星、乐视任系统工程师,对移动端操作系统有较深入的研究,致力于搭建完善的性能优化 & 监控体系,保障交付质量,持续提升客户端的用户体验。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 InfoQ 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档