作者简介:黄浩宇目前就职于腾讯社交网络运营部,负责SNG社交网络业务移动端产品的业务运维,如QQ、QQ空间业务优化与发展。曾就职于阿里巴巴,负责天猫双十一、天猫周年庆等天猫商城活动业务的运维。简介移动互联网发展如此之快,运维技术也要适应业务变化。这次小编找到了腾讯高手介绍的手Q和手Q空间的速度优化实践。我们坚信,不同垂直领域的运维分工会越来越不同。如何在不同的业务形态下,利用运维技术和数据为业务带来更大的价值,将是我们下一步探索的重点。1、关于用户等待时间对于用户来说,最直观的感受就是APP的等待时间,所以我们首先要分析清楚APP在哪些地方让用户等待,哪些地方需要时间。等待时间无外乎以下三种:服务端处理耗时,网络传输耗时,客户端数据处理/UI渲染耗时界面耗时基本在30-120ms,优化服务端的实际收益不会很好。下面主要介绍后两个方向的优化实践。2、网络传输首先我们需要统计数据在网络中传输的耗时情况,从而知道优化网络传输的价值所在。成本低,具体方案如下:记录第一次握手时服务器收到SYNC包的时间Time1。记录服务器在第三次握手时收到ACK包的时间Time2。两个时间之差就是网络往返时间RT(Time2-Time1)(见图2.1)图2.1从服务器测量网络延迟通过实际数据统计,在没有跨网访问的情况下(信号正常):4G大约需要30-100ms,3G大约需要200ms-400ms从速度结果来看,目前主流的3G/4G网络速度还是比较不错的,但是由于移动网络的复杂性,还是有很多QQ、空间服务返回码监控问题:跨网访问区域访问部分小运营商、劫持等分享一下移动Qzone在访问组件中的优化策略自有协议直连IP长连接访问(图2.2)优点:减少DNS请求耗时避免DNS域名劫持单个连接并发多个数据请求减少连接开销(相对于http)私服协议加密安全;首次连接需要额外策略寻找合适的接入点,需要重定向能力图2.2私有协议直连IP长连接2.2.2首次连接策略世界上最远的距离是你在联通我在中国电信。在复杂的移动网络环境中,我们需要优化网络接入策略,避免跨网/跨地域接入。我们在使用移动网络的时候,首先识别用户的运营商,同时开启4个连接,多接入IP+多端口+2协议,然后同时使用2协议多端口,避开一些限制本地运营商,在第一次连接时使用连接(见图2.3)图2.3第一次并发尝试连接使用WIFI的用户在第一次连接时会优先使用域名尝试连接。当以上策略均无法连接时,客户端将运行评分策略,使用备用IP列表以最快的速度连接。腾讯在国内拥有大量的CDN节点,即使是偏远地区也可以通过CDN节点代理访问!优点:多种先连接策略,可以有效保证用户尽可能先连接到服务器,这在复杂的移动网络中尤为重要!缺点:第一次连接有额外的开销;连接不一定是最佳接入点;使用CDN节点作为代理访问成本较高GSLBIP库标识用户的出口IP。如果发现用户的访问不是最优的,它会通过大数据分析用户在一定时间段内最应该使用的访问点,会发出重定向命令,让客户端连接到最优的服务器访问IP,WIFI下会缓存SSID和接入IP。优点:让用户就近/最优访问,减少网络耗时缺点:小部分用户首次使用需要连接两次服务器;2.2.4使用字典进行数据压缩,减少带宽开销;安全2.2.5心跳避免长连接Disconnect2.2.6与传统的多连接单请求(HTTP2.0之前)的HTTP模式相比,单连接并发请求可以大大减少客户端和服务器的开销。结语我们在移动网络上能做的优化无非就是减少连接数。减少请求,避免跨网跨地域,优化协议。随着4G/光纤的快速发展,未来越来越多的用户花在网络上的时间会越来越少,这意味着我们网络策略的优化效果也会越来越低。这个时候,我们就把注意力转移到终端上。3、终端耗时同上。首先,需要确认终端的耗时,以确认优化的期望和目标。通过对客户端埋点的上报监控发现,灰度版手机QQ空间部分操作后3秒以上无响应的比例高达30%;某灰度版手Q因UI问题导致帧率在15%左右。%,在投诉类目中,卡顿、慢、卡顿的投诉量长期位居前三。可以断定,终端的问题非常严重,直接关系到用户的操作体验!3.1Android/IOS系统背景既然要优化手机客户端,就需要对操作系统(Android和IOS)有一个基本的了解,都是基于UNIX/LINUX开发的系统,很多概念很容易理解运维人员。一个比较重要的设计理念是Android和IOS都可以进行多线程开发,其中一个就是主线程,也就是UI线程,UI线程是唯一有权限操作的线程用户界面。如果用户遇到运行问题,那一定是因为主线程阻塞或者没有足够的资源运行。于是从主线程的监控和系统资源的占用入手。3.2监控策略如何判断终端卡慢等性能问题?通过上面对andoid和ios的后台介绍,我们的目标是监控主线程。这里主要有两种监控策略:1)。函数间调用耗时当主线程调用一个函数调用超过N秒时,主线程处于等待阻塞状态,所有用户UI操作都被挂起,因此认为终端卡住了。缺点:不能准确反映用户体验优点:实施成本低,开销小2)。监控屏幕FPS,监控掉帧数。当用户操作时出现页面掉帧,则认为是用户操作慢或卡住(如图3-1所示)优点:真实反映用户体验,可以对慢、慢卡的体验进行分类,如如短卡和长卡。缺点:有额外的FPS监控开销,经测试约占整个APP成本的2%如图3-1,监控画面的FPS数3.3Stack采集和监控策略。接下来要考虑如何配合监控策略获取“犯罪现场”的数据,并上报给服务器。“案发现场”数据除了CPU、内存等系统资源外,还必须是代码的执行栈数据。由于移动端的性能资源有限,我们在采集栈数据时必须非常注意对系统的影响,因此需要确定触发采集栈的时机。这里主要有两种收集方案:3.3.1开启附加线程记录主线程栈开启一个附加子线程,记录主线程的栈数据,发生卡顿时从本线程获取栈数据。优点是只需要引入一个小的SDK包,以及版本编译方法和虚拟机。获取筹码的策略也分为消极策略和积极策略。消极策略:认为减速的问题在短时间内只会发生一次。如果错过,将无法获得真正的现场堆栈。这种策略的方法是:子线程时刻获取主线程的栈。当主线程出现问题时,子线程通过问题的开始时间戳和结束时间戳获取事件发生时的堆栈数据(如图3-2)缺点:子线程需要时刻记录主线程栈,开销大。优点:获取的栈数据准确图3-1主线程函数调用耗时监控正向策略:认为缓慢卡顿的问题会在短时间内出现几次或持续一段时间。该策略的方法是:当主线程出现问题时,激活子线程获取栈,在接下来的N秒内在子线程中获取X个栈。缺点:栈是随机的,得到的栈是事件发生后的栈。优点:几乎没有额外的开销,对APP基本没有影响3.3.2编译阶段的打桩/嵌入点通过在编译阶段使用工具,在每个函数调用点添加耗时统计函数缺点:增加体积APP包的大小,经测试会增加APP包大小的10~20%左右,不同的编译方式和虚拟机需要不同的工具来支持打桩嵌入;缺少系统调用数据优点:运行时没有额外的线程开销两种方案都有各自的优势和可取之处,但是由于产品对包大小有严格的限制,目前QQ和QQ空间主要采用方案13.4大数据集群分析如前所述,方案一的负向策略对终端性能影响很大,而主动式策略得到的数据是随机的。即客户端无法准确捕获问题栈。目前主要采用主动策略+大数据聚类分析的方法来分析问题。这个解决方案的基本思路是,如果一段逻辑代码真的出现了性能问题,大多数用户都会遇到。因此,我们采用对栈数据进行聚类分析的方法,找出能够形成数据规模的栈,过滤掉因随机性而偶尔得到的无关栈。在栈聚类统计方面,我们主要通过构造CT(ClimbingTree)来解决。ClimbingTree是内部名称,主要思想是通过stack生成一棵栈树,用海量数据加权计算(主要是函数耗时)到树上,最后将同一层的节点按照从左到右排序到权重,并设置低于某个阈值的节点被修剪。ClimbingTree的特点是同一父节点的子节点的权重从左到右递减。3.4.1构建CT(ClimbingTree)图,首先对用户上报的栈数据进行预处理,包括解密文件、翻译栈函数、格式化栈、过滤掉无关数据等步骤,最后生成业务函数调用关系链。根据调用关系,合并同一个用户的多个调用关系链,添加相同的节点耗时,并根据每个树节点的耗时从左到右排序,生成函数调用关系树(见图3-3)图3-3函数调用关系树将多个用户的调用关系树组合起来,在阈值以下剪掉权重低的节点的分支,生成CT(ClimbingTree)。这棵树包含所有问题栈的数据聚合,问题严重性从左到右排序(见图3-4)。图中假设每个节点耗时1s,所以CT中的A-B-C调用关系链很可能就是问题所在的函数调用关系链(因为C节点与父节点的耗时比为:2/4=50%)图3-4CTCT的优势在于将海量数据收集到少量的森林数据节点中(大约90%-95%的数据量被压缩)。由于左子节点肯定比右子节点花费的时间长,所以往往左子节点是影响父节点的问题。通过分析左子节点与父节点的耗时比,可以得到函数耗时的根本原因(见图3-4、图3-5)。图3-5查找函数节点耗时的根源3.5终端常见性能问题汇总最常见的问题是主线程中的长时间耗时操作,如数据库操作、网络连接、等待网络数据、等待用于复杂的逻辑运算、SD卡校验或读写。常用的优化方法:使用子线程做异步操作,比如数据库写操作,配置网络拉取等,可以提前预加载。比如用APP打开等待首页打开长网络连接,预加载影音数据等,都可以延迟。3.6案例及效果优化后QQ部分版本卡慢投诉情况:安卓Q空间:部分版本卡慢发生率(卡慢发生率=卡慢人数/用户数)4.总结,在移动互联网高速发展的时代,运维技术必须适应业务的变化。技术为企业创造价值的一个小案例。我们坚信,随着运维岗位的发展,不同垂直领域的运维分工也会出现。不同业态如何利用运维技术和数据为业务带来更大价值?说话让数据说话,将是我们下一步探索的重点方向。
