QQ业务优化效果
背景介绍
随着移动互联网的快速发展,用户对移动应用的体验要求越来越高,作为一款拥有数亿用户的即时通讯软件,QQ在用户体验方面的优化显得尤为重要,本文将详细介绍QQ在网络传输、终端耗时和系统资源占用等方面的优化实践,并探讨这些优化措施带来的效果。
1、网络传输优化:
统计网络耗时:通过TCP协议的三次握手过程来统计网络耗时,包括记录第一次握手时服务端收到SYNC包的时间Time1和第三次握手时服务端收到ACK包的时间Time2,两者之差即为网络往返耗时RT(Time2-Time1)。
私有协议直接IP长连接访问:使用私有协议进行直接IP长连接访问,减少DNS请求耗时,避免DNS域名劫持,单个连接并发多个数据请求减少连接数的开销(相对HTTP),私服协议加密安全。
首次连接策略:识别用户的运营商,同时起4个连接,多个接入IP+多个端口+2种协议,再同时使用2种协议和多个端口是为了避免有些本地运营商的限制,使用第一个连接上的连接,WIFI下优先使用域名尝试连接,当上面策略都连不上时客户端会运行打分策略,使用备份IP列表连上一个速度最快的接入。
最优接入&重定向:连接上之后服务端通过GSLB IP库识别用户的出口IP,如果发现用户的接入不是最优的接入,通过大数据分析该用户在某个时段最应该使用的接入点,会下发重定向指令,让客户端连接到最优的服务端接入IP,WIFI下还会缓存住SSID和接入IP。
心跳:避免长连接断开。
单连接并发请求:相对多连接单请求的传统HTTP模式(HTTP 2.0之前),用单连接可以大大减少客户端和服务端开销。
2、终端耗时优化:
监控函数间调用耗时:当主线程调用函数调用超过N秒时,主线程处于等待堵塞状态,用户所有UI行为暂停,所以认为终端出现卡的情况,优点是实现成本低,开销低;缺点是无法准确反应用户的体验。
监控屏幕FPS,监控掉帧数:当用户操作时发生页面掉帧时,认为用户发生卡慢或卡顿(如图3-1),优点是真实反应用户的体验,而且能对卡慢卡顿的体验分级,如分为短卡、长卡;缺点是有额外的FPS监控开销,经过测试该开销大概占整个APP开销的2%。
堆栈的采集:额外启动一个子线程,子线程记录着主线程的堆栈数据,当发生卡顿的时候从该线程获取到堆栈数据,优点是只需要引入一个很小的SDK包,而且无视版本的编译方法和虚拟机,获取堆栈的策略也分为消极策略和积极策略,消极策略认为卡慢卡顿的问题在短时间内只会发生一次,如果错过了将无法获取到真实的现场堆栈,积极策略则子线程时刻获取着主线程的堆栈,当主线程发生问题时,通过发生问题的开始时间戳和结束时间戳,在子线程获取到案发时的堆栈数据。
3、系统资源占用优化:
降低主线程任务量:通过代码拆分组成动态库并进行懒加载,减少主线程所执行的代码总量,例如代码下架,代码执行时机延后或异步子线程化,代码逻辑执行效率优化等。
提高主线程优先级:提高主线程的优先级QoS,使其在竞争中更容易获得CPU资源。
减少子线程的数量:通过设置target_queue来控制队列的层级结构,避免频繁开辟子线程导致的“线程爆炸”。
降低子线程QoS:降低全局队列QoS设置为DISPATCH_QUEUE_PRIORITY_DEFAULT的任务优先级,减少对主线程的影响。
优化效果
1、网络传输优化效果:
- 减少了DNS请求耗时,避免了DNS域名劫持的风险。
- 单个连接并发多个数据请求减少了连接数的开销,提高了网络传输效率。
- 通过最优接入&重定向策略,让用户能够就近/最优接入,减少了网络耗时。
- 心跳机制避免了长连接断开的问题。
- 单连接并发请求大大减少了客户端和服务端的开销。
2、终端耗时优化效果:
- 监控函数间调用耗时和屏幕FPS,真实反映了用户的体验,并对卡慢卡顿的体验进行了分级。
- 堆栈的采集帮助开发团队获取到了案发现场的数据,为后续的优化提供了依据。
3、系统资源占用优化效果:
- 降低了主线程的任务量,提高了主线程的执行效率。
- 提高主线程优先级使其在竞争中更容易获得CPU资源,减少了主线程被抢占的情况。
- 减少子线程的数量和降低子线程QoS减少了对主线程的影响。
通过对网络传输、终端耗时和系统资源占用等方面的全面优化,QQ在用户体验方面取得了显著的提升,这些优化措施不仅提高了网络传输效率、减少了系统资源的占用,还真实反映了用户的体验,为后续的进一步优化提供了有力的支持。