如何应对关卡资源冗余?《天天爱消除》服务器性能优化详解

腾讯游戏学院 2018-12-17
本文节选自《2018腾讯移动游戏技术评审标准与实践案例》手册,由腾讯互娱高级工程师罗雄威介绍《天天爱消除》服务器的内存、强校验性能、异步开发效率、登录等问题的解决方案和优化效果,完整手册可于文末免费阅读和下载。

一、概述

《天天爱消除》服务器已经在外网稳定运行四年多了,日积月累服务器方面出现了一些问题。主要包括内存,强校验性能,异步开发效率,登录等问题。本文记录这些问题的解决方案和优化效果。

二、服务器进程内存优化

2.1 服务器进程内存现状

《天天爱消除》外网机器负载表现为内存占用率较高,CPU使用率较低,同时因为是弱交互的手游,网卡流量并不会存在瓶颈。玩家同时在线高峰期,机器内存使用出现告警。核心进程组gamesvr和checksvr占用内存过多,下图1是机器内存使用情况。

图1:服务器进程内存使用图

分析发现checksvr进程内存主要消耗在加载关卡资源,在一个set集中,同时启动了4个checksvr进程,每个进程都加载了所有版本对应的关卡资源。gamesvr内存使用量正相关于玩家同时在线人数,主要消耗在排行榜。爱消除排行榜是直接实现在gamesvr中,并在进程内部缓存。图2和图3是checksvr和gamesvr内存使用占比示意图。

图2:checksvr内存使用占比示意图

图3:gamesvr内存使用占比示意图

2.2 服务器进程优化方案

针对checksvr关卡资源冗余带来的内存开销,新方案中结算校验时通过gamesvr在请求包中把关卡资源带过来,从而减少checksvr常驻内存使用量。为此会带来一点额外的CPU拷贝开销。

针对gamesvr排行榜内存消耗,有两种解决方案。第一种就是把排行榜独立出gamesvr,形成单独的排行榜服务。但这相当于把内存转嫁到其他机器上面去,因为新排行榜服务需要申请新机器。另外独立排行榜方案需要对gamesvr逻辑代码大量修改。第二种方案是采用CPU换内存的方式。我们前文提到,核心进程组机器CPU使用率比较低。所以最终我们采用压缩排行榜数据的方式优化掉gamesvr内存。图4和图5是核心进程组内存优化效果。从两图中可以看出我们用不到10%的CPU增长节省了2.4GB左右的内存。

图4:内存优化效果图

图5:CPU消耗对比图

三、checksvr架构和性能优化

3.1 checksvr功能概述

checksvr是爱消除后台用来进行强校验的服务。该服务对玩家每次结算请求,服务器后台运行跟客户端一样的消除库,得出结果,跟客户端上报结果进行对比,从而判断玩家是否作弊。该服务在保证游戏公平性方面有着重要作用。

客户端每个版本对应一个滑动库so,单个checksvr进程加载所有版本对应的校验so。图6是优化前gamesvr和checksvr通信示意图。

图6:gamesvr和checksvr通信示意图

3.2 checksvr存在问题

目前checksvr架构主要存在如下几个问题:

编译耗时。每次客户端发布新版本,后台需要把所有客户端版本对应的so全部编译。

维护困难。因为后台和客户端共用滑动逻辑库代码,后台每次需要重新编译所有so,客户端在开发新版本时,滑动库相关代码只能增加不能删除,否则会导致低版本校验so编译不过。

性能问题。tbus轮询收包方式导致校验请求包在队列延迟大,同时单局较验耗时较长。

3.3 checksvr架构和性能优化方案和效果

针对3.2小结提到的问题,我们采用如下优化方法:

1.单进程加载单个版本较验so,可以解决每次客户端开发新版本,低版本校验so需要全部重新编译的问题,但是这样会导致checksvr进程数量变多。

2.根据外网玩家在各个版本的分布情况,合并多版本较验so到单进程,减少进程数。

3.在tbus组件基础上,引入事件通知机制,减少校验包在队列延时。

4.精简滑动库在服务器端的逻辑,perf工具分析热点函数,提高较验单局性能。

图7:checksvr架构优化前后对比示意图

经过上述优化之后,客户端在开发新版本时不再需要重新编译所有低版本so,同时性能也得到了提升,图8和图9是优化前后的对比示意图。优化后队列延时平均从10ms降低到了4ms, 单局校验平均耗时从45ms降到了30ms。

图8:优化前后校验请求包在队列延时对比示意图

图9:优化前后单局强校验耗时对比示意图

3.4 http类服务开发效率优化

《天天爱消除》后台存在一些这样的服务,它们通过http协议与外部平台通信完成某些交互。比如friendsvr跟微信、手Q开放平台通信,完成玩家好友关系链的操作;dealsvr跟数平通信,完成游戏一级货币钻石的各种操作。这类服务基于tapp框架,采用curl异步编程模式来并发,它们普遍存在代码维护困难,开发效率不高等问题。

为解决上述问题,我们在这类服务中引入协程库。对代码进行改造,我们选用公司内部开源协程库libmt。图10是在tapp框架中引入协程之后的调度机制示意图。

图10:tapp框架引入协程调度示意图

引入协程后,这类服务代码开发和维护就像写同步代码一样,结束了异步代码满天飞的局面。图11是优化前后两种模式下完成一个需求的开发对比图。该需求就是简单统计下,玩家在登录和非登录阶段去数平拉取钻石成功和失败量。

图11:协程引入前后业务开发对比示意图

3.5 登录过程优化

《天天爱消除》后台已经在外网运行四年多了,游戏业务逻辑不断增加使得游戏在登录过程中需要下发给客户端的包越来越来多。有部分玩家投诉游戏登录不上,客户端表现认为是后台超时。

图12:登录超时表现

外网统计数据表明登录过程中后台下发包量平均在260个,并且玩家过关数越多,包量越多。针对登录过程中下发包过多的问题,有两个方案可以考虑,其一是启用Tconnd的压缩和合包功能,但爱消除的Tconnd运行在TDR模式,而Tconnd只有在GCP模式下面才支持压缩和合包。GCP模式需要客户端引入新API,这明显不适用于爱消除的情况,因为我们需要兼容版本众多的老客户端。其二是游戏gamesvr自己修改逻辑,针对其中影响比较大的协议按照如下方式分别进行修改:

图13:登录包量优化方案

优化过后外网登录下发包量减少效果比较明显,如下图14所示。在我们使用的方案中,新版本客户端基本不需要修改逻辑代码,同时可以通过修改后台服务器逻辑代码做到兼容低版本客户端。


图14:登录包量优化对比图

来源:腾讯游戏学院
原地址:https://mp.weixin.qq.com/s/TvGBWZ_hFDqrJpmYTS2ssg


最新评论
暂无评论
参与评论

商务合作 查看更多

编辑推荐 查看更多