腾讯高级工程师李国栋:深度解析腾讯移动分析 MTA 的 Crash 实时处理系统

  • 陈思

2017 年 6 月 20 日

话题:腾讯语言 & 开发架构

2013 年,腾讯移动分析(Mobile Tencent Analytics,简称 MTA)产品推出,是腾讯大数据对外开放的核心产品之一,Crash 实时处理是其一核心子系统。初期主要面向公司内部用户开放。为了跟随公司开放的脚步,腾讯的研发者们也在不断向外开放和输出自己的核心专业能力,为开发者提供更有价值的功能,为 App 的质量保驾护航。

近期,腾讯移动分析 MTA 对 Crash 系统做了全面的优化升级,不仅支持捕获全平台异常堆栈,还支持实时还原与报表查看,告警监控等一系列功能优化。

腾讯高级工程师李国栋表示,就整个开发过程来说,至少有三个里程碑:

Crash 系统的里程碑

一、基础功能的解决方案

这一块对开发者来说是一个强刚需的产品,即对 Android 和 iOS 原生 App 的异常处理。

其中核心的一个突破在于面向 Android 的 java 和 NDK、iOS 的 Objc 和 Swift 两大平台四种语言,MTA 做到了 Crash 的全平台覆盖捕获,堆栈实时还原,秒级监控告警,实时统计、前台报表呈现。虽然过程充满各种挑战,比如 NDK 异常堆栈捕获,但团队已积累多年丰富经验,攻克一个又一个技术难度,整个实施过程快速高效,很快便完成整体化改造。

二、细分领域 Crash 解决方案

除了原有的一个基础 Crash 解决方案之外,还有一个针对专业领域的模块,主要针对游戏引擎,目前游戏客户的需求,也是 MTA 内外部产品改进的一个重要驱动力。

据 MTA 内部统计,游戏类 App 的平均 Crash 率远超普通 App 的一倍之多,当前主流游戏引擎是 Unity3d 与 Cocos2dx,上面有四种开发语言环境:C/C++、Lua、JS 与 C#,以此为基础,可以为游戏领域提供移动端全面的解决方案,不仅是 Crash 捕获统计,还有日活统计、时长统计、自定义事件、分群画像、接口监控等一系列功能,目前都正在灰度测试中,很快就会推广给更多用户。

三、整个的 Crash 系统产品形态包装

目前,整个面向 App 质量的整体解决方案还是以 MTA 这个产品中的一个功能模块对外提供服务的,腾讯大数据内部在构建一种新的产品形态,可以更好为 MTA 在开发者与 App 质量提供的便捷服务,也许在不久之后就会推出。

“MTA 希望能够依托团队对数据处理多年的积累,提炼信息指纹,聚类归并相似问题,辅助开发者更快、更简单、更有效解决 App 质量问题。”李国栋说。

Crash 系统作为腾讯 MTA 的子功能模块,并不会像用户活跃数据这样每天都上报,而只会在用户 App 出现问题时进行数据上报,因此 Crash 消耗的资源相对较少。但即便如此,Crash 每天也有 10 亿多的数据流水。

经李国栋介绍,项目组在整体上对系统进行了云化(虚拟化技术)的处理:“常规集群的话基本上维持在 1000 vCores 的状态,内存总共使用了 2.8T。计算资源作为里面的核心资源,我们做了很多的性能的优化,我们的 vCores 仅使用了 600 个,内存只占用了 1.8T。”

移动分析系统的技术难点

MTA 的 Crash 系统有别于普通的移动统计分析系统。根据李国栋的分析,主要的挑战点在于海量数据实时的还原处理、指纹智能提取合并、多维查询和性能 4 个维度。

还原处理

原始的堆栈可读性非常差,比如 iOS 和 Android 的 C/C++ 堆栈就是一串长长的地址,用户几乎无法用肉眼看到有用的信息,所以,还原是每一条 Crash 堆栈上来之后,必须要经过第一道工序,只有真正还原到真实的类、函数和行号,才能快速辅助定位问题。

对于单一堆栈来说,其结构是非常复杂的。Crash 堆栈中既包含 App 本身固有堆栈,也有第三方组件,甚至还有很多系统级堆栈,所以,还原过程不仅只是涉及到 App 本身符号表还原,还有系统库的符号表还原。同时,还原的过程中会涉及到大量的地址计算和字符串匹配,这些都是比较消耗计算资源的,MTA 在这方面也是做了很多优化,才保证整个处理过程控制在秒级。

指纹智能提取合并

原始堆栈还原后,通常包含大量无效的信息。

因为由于 App 版本、CPU 指令集、发布渠道等不一样,Crash 堆栈还原后,很可能会分成 N 个,或者反过来,几个不同 Crash 堆栈还原后,可能会落地在同一个特性堆栈中。因此,如何在堆栈中提取能够真正代表这个 Crash 的堆栈指纹是非常关键也是非常有必要的,这能够帮助用户发现真正的问题。

所以,要保证相同的堆栈归类到一个,而不是说每个堆栈就是一条记录,避免开发者看起来很复杂。腾讯移动分析 MTA 从用户最关注点出发,以“App 到组件到系统”三个层次做分级,把用户最关注的 App 本身相关内容优先做提取,再经过“干扰数据消除技术”,把不相关堆栈也过滤掉,保证提取出来的堆栈就是能够代表 Crash 关键内容且用户也是最关注的部分。在堆栈的调用过程中,MTA 要去分析它调用链的调用情况,这也是很大的技术挑战。

多维查询

Crash 如果一旦出现问题,其实开发者是很关心的,需要第一时间去找到这个问题,但是怎么找,有很多方法:可以通过机型、版本,还有时间,通过用户 ID 甚至 App 内的用户账号,还有就是堆栈的一个模糊的搜索匹配等,这些都是用户常用且很需要的搜索功能。

性能

实时是由始至终贯穿所有环节的。为什么要强调实时的概念?这是因为,整个大数据行业的大趋势早已完成“离线到准实时到实时”的演变,行业多数还停留在小时级别,而 MTA 在实时方面的建设始终都是以业界最严格的标准来做的,所有的实时指标都控制在秒级范围内。

一方面得益于腾讯大数据团队在大数据这块做的非常多的基础平台工作,以及集团公司提供的公共基础设施如统一接入网关、统一数据中间件之外,系统本身也做了大量的优化处理。为了突破系统性能瓶颈,MTA 团队不断挑战专业技术最高点,从 CPU SSE 指令、多对称网卡驱动、网络协议栈改造、操作系统内核与配置优化、同步异步协程模型,基本上由最底层到上层,穿透了硬件到驱动到协议到架构再到逻辑层的优化技术,把性能挖掘到极限。再通过整个系统的云化处理技术,做到资源合理利用,分集群部署。

MTA 的高可用

腾讯移动分析 MTA 在后台支持业务分集群隔离,比如手机 QQ 一个、游戏一个、微信一个,以及对外的公共服务集群也有一个。再比如说高峰期的时候,MTA 支持一个动态资源的协调,从维度上来看的话,MTA 对外的公共资源的日处理量已经达到了 4400 亿的规模;并发请求 MTA 目前做到了一秒千万级别;因为一条上报它可能包含着多条的日志的,(从为用户省流量的角度考虑,处理日志时,做了合并上报),所以日处理量可以达到一秒几千万的计算能力。

从这个方面来说,腾讯 MTA 的高可用,可以通过两个维度来衡量。

第一个维度就是系统服务的质量。

从系统服务的质量来说的话,MTA 系统已经做了一个云化处理,支持 AutoScaling;以及所有 MTA 的系统,都托管基于一个叫“gaia”的云平台,在那里也可以支持 MTA 的任务调度以及资源的协调,实现资源共享,具有伸缩性。同时对于一个分布式服务器系统来说,从硬件到驱动到协议栈到操作系统内核再到逻辑架构,MTA 都是经过深度定制优化,保证系统具备有高可吞吐量的计算能力。

第二个维度就是数据的质量。

从数据维度来看,MTA 数据的处理过程也是基于腾讯的大数据处理平台,这个平台在腾讯内部已经大规模的使用于腾讯的金融支付、社交媒体及广告服务中,非常稳定可用。

李国栋举了一个例子:TDBank 系统是一个消息中间件,这个消息中间件不仅起到消息的一个数据流转的过程,必要时,它有起到一个缓冲的削峰的作用。比如说在某个时间点,一下子大量的数据过来了,后端模块不能及时响应,在这个时候 TDBank 会把这个日志给缓存起来,做数据回放,这样的操作保证腾讯的数据不会丢失。

从整体上看,MTA 除了数据和系统维度,还有腾讯 TGW 这样子的统一网关保证全网运营商最优接入,还有门神系统保障诸如大规模网络攻击等安全问题等系统平台,来保障 MTA 的系统是全面稳定可运营的,所以,不管从哪个维度来看,不管是从系统服务和数据安全各方面,都可以保证 MTA 的服务的稳定性,实现高并发可用。

数据采集与数据处理

分析系统能否收集和分析所有 Native 层 Crash?

李国栋的回答是:可以。同时他也表示:“这是 Crash 的基本能力。”

具体表现在两个维度上:

数据采集

据最新统计,Android 和 iOS 两个主流系统已经在市场上占率已超过 95%,腾讯移动分析 MTA 在原生系统上重点也是面向这两个系统。对于 Crash 捕获来说,Android 有两个层面:一个是 java,一个是 C/C++ 的层面,而 iOS 有 Swift 和 Objc 两种语言,这些已经全部被覆盖。

“这里面我们想要强调一点”,李国栋说:“目前在这一块的捕获当中,其实对于安卓的 C/C++ 捕获,业界很少有产品服务能力,因为涉及到很多的技术挑战,不仅要掌握 linux 的信号量机制,还要处理 armeabi、armeabi-v7a、x86 和 mips 本身固有的平台指令差异问题,还要兼容 64 位版本的平台。在 Crash 发生后,系统传给我们的数据非常有限,只有信号量、Crash 地址这些非常非常基础的信息,这就是说,我们必须要通过一个简单的 Crash 地址,完成一个函数调用的调用链回溯、寄存器数据、子进程数据、临近地址空间,这里面也涉及到大量的技术挑战。”

数据处理

数据处理聚集在终端上报的异常的实时化处理,关键在于堆栈还原与分析,MTA 建设了一套完整的数据处理方案,可以让开发者通过简单上传符号表就能查看所有异常堆栈、调用链、埋点日志,精准到行号。

再加上对专业领域、专业组件的深度定制,MTA 基本上覆盖移动端 Crash 绝大多数场景,开发者只要通过简单的一两行代码,便可得到一个完整的解决方案。

不管是对于 Crash 系统还是整个腾讯移动分析 MTA 系统来说,虽然存在前面提到的多平台覆盖、实时化计算、实时还原合并等各种挑战,但李国栋告诉我们,腾讯内部一直强调的是不管多有难度的技术,都要做到“深入浅出”,对于 MTA 来讲,最直接的莫过于“一行代码,一个系统”。只要终端简单集成一两行代码,不仅即刻拥有整个腾讯大数据平台资源万亿级的计算处理能力,还可通过丰富的报表管理台,实时查看 Crash 指标、自定义事件、页面时长、可视化埋点指标等一系列的功能,真正让用户用的灵活方便。

讲师介绍: 

李国栋,主要负责大数据统计平台、推送平台 Android 终端研发和优化工作,在移动端性能优化、网络优化、质量监控方面有丰富的开发和实战经验,近期工作内容是质量监控系统改造与优化,解决 Crash 系统全平台支持与实时化建设,提升开发者效率,同时还关注移动互联网开源新技术研究工作。

腾讯语言 & 开发架构