美文网首页
游戏服务器优化总结

游戏服务器优化总结

作者: Aska偶阵雨 | 来源:发表于2020-06-11 17:39 被阅读0次

    优化可能牵一发而动全身,尽快利用各种手段解决问题,保证项目运行

    逻辑帧处理优化。因为玩家的交互我们必须要控制在一定时间内,比如100ms。找到最耗时的函数,内嵌检测,运行超时LOG。大量道具,NPC等 位置计算,伤害计算等数学计算过多,不可控的玩家行为,跨线程访问,不合理的线程粒度 。可以给对象设置激活状态,没有激活的对象不跑逻辑。大量的对象就要分批计算、如果一个逻辑帧跑不完所有的对象,就会分段来计算。逻辑帧里面把N个消息包合成一个发送,降低数据包的量级。

    锁操作优化。锁操作力度尽量小一些,因为锁的力度大了以后很多资源要等待。死锁现在已经很少发生了,因为锁规划合理以后其实没有大家想象的那么恐怖。假设有一个消息链条,一秒10万个数据往外发,分成逻辑帧,一个逻辑帧里面可能有几千个,几千个不可能锁住之后把它发出去,然后一个交换队列发出,就是尽量减少操作中的一些时间。

    数据结构优化。就是说要把里面的成员变量压缩的尽量小,因为游戏玩家上线的时候要求效率非常高,3-5秒之内就要进入场景里面去,所以说它的存档要尽量小。假设一个玩家存档优化完了之后是500K,因为现在网卡都是千兆的,设计阶段我们就可以通过计算知道每秒存档数量大概2K左右。所以这个时候在数据结构上的优化会特别多。

    网络包优化。逻辑帧里面提到过把N个消息包合成一个发送,降低数据包的量级是一种方法。大量的网络IO重点优化包,找到发送最多的包,流量统计,LOG记录。然后逻辑上进行优化。例如AOI系统中,我走了一步因为椅子挡住了,所以只有前面的兄弟看到我走了,所以这就是一个控制的范围,这个包的数量就是一个级数级的减少。还有一个是使用内存池,这个好像很正常,因为网络消息太频繁了,每秒大概十几万包往外发的时候,一天下来就几十个亿,所以必须要用内存池。

    网络链接优化。 创建链接开销大,使用网络连接池解决 。开服玩家大量涌入,从设计上支持动态增加网关服务器解决 撞库等异常的网络攻击,及时彻底释放,封IP解决,网络消息包频率检测,恶意登录验证码校验等。

    线程的优化。尽量减少锁的时间 尽可能的少调用锁 减小锁粒度 线程数控制,线程间切换开销 利用析构自解锁,防止死锁 游戏服务器的线程处理 网络 数据库 存读档 内部LOG 系统 游戏场景。有几个地方会用多线程:一是网络,一次交换收到的消息到处理线程;二是数据库,游戏里面写比读要频繁,所以分成读写锁,而且不能在关键节点存档;三是内部log系统,一次交换到写线程批次写入;四是游戏场景,不同的游戏有不同的操作,有的是多进程有的是多线程,不频繁操作,注意锁定时间。这里面有一个小的技巧,就是线程数要控制,因为CPU的轮片,要保存在当前场景然后再切换调度,时间都消耗在那里了,所以线程数目控制在你认为合理的范围内就可以了。

    存档数据库优化。尽量保证不回档 设计存读档缓冲,减少直接对数据操作 增加存档频率,设定重要存档节点 控制存档数据大小。这个点的优化大概有几个点:一是缓存存档,我们专门做了一个缓存服务器出来,缓存存档还做了一个队列,队列里面会对存档次数包括它的一些算法保证优先级高的放在存档队列的最前端,让它优先存档,比如定时存档、升级存档是有一些优先级的;二是关键点存档,就是某些动钱的地方,关键的道具升级存档;三是压缩数据,因人而异,因为压缩和解压缩是有效率损失的。存档优化的一个目的就是保证不回档,好多时候有些外部因素是不可避免的,比如机房服务器断电;还有按战区分档数据库,类似于分布式存储,存不了就只能分库分表,这里主要讲的是思想。

    内存优化。单个对象的内存占用尽量少,比如使用标记位 频繁申请释放的对象使用对象池,碎内存控制。重载new delete,每一次内存分配都会记录下来,哪个地方每天分配了多少次,消耗了多少内存,是不是有内存泄漏等。

    log系统的优化。计算极限,各个相关设计写入读取频率和数量 大量LOG写入,分批次持续写入 LOG系统分级,控制写入阀值 ,统计系统同步,时间点选择。很多线上问题log系统是分析问题的基础,运营log可以写在mysql数据库里的,通过运营分析系统分析出来。运维log写到本地让运维系统去拿。不管哪种,都要在出问题时,第一时间定位出来为什么出问题了。

    调用第三方API优化。考虑全面尽量少受影响 除非必要,否则不必须全信任并等待 开辟专门的线程或者服务等用于第三方API调用,并设置时间长度 第三方调用、超时、失败要统计 保证自身系统受第三方影响降到最低。

    和业务上配合的优化。活动修改,错峰进行。咱们的开发或者说咱们的架构是和业务相互促进的,好多时候其实它就到了一个极限值了,每一个计算机绝对有一个极限值,要突破这个极限值,好多时候就是一个业务上的调整了。比如游戏里面有一个叫做虚假繁荣点的设定,就是做假的,让玩家觉得人多,这属于一个不算是投机取巧,只能说是一个核心业务上配合的优化,不可能说计算机系统就一直把它优化到最牛,当然这不是跟产品的兄弟扯皮,能做的咱们尽量做,当达到一个极限的时候,或者有更好解决方案的时候,和业务上的优化是可以想一想的。活动修改,错峰进行,在游戏中有很多活动,包括网站上也有很多活动,比如打折、优惠券,比如我抢个7,抢7的时候如果这个活动跟你同时进行,再发个2000块钱的优惠券,这个时候网站就把数据飙起来了,当然这你可能错一下,从业务上就把这个东西解决了。

    灵活可控的开关系统和配置文件。随时指定某个模块开放或关闭,因为游戏是实时运行的,比如有大量玩家在线是不能把游戏关掉然后上传新的版本更新的,这个时候对于一些不重要的出问题的系统,比如邮件或者聊天可以临时关掉。

    随时控制物品的产生,可能现在和咱们这个确实不太搭,随时控制物品的产生,什么意思?比如说咱们有一些抽奖,会控制一个物品产生的概率,因为原来比如说概率是十万分之一,结果少了一个零,变成了万分之一,所以说拿个开关把他控制一下把他关掉,这个东西就不许出。当你做产品做到高级别的时候,你会发现自己不光是技术,绝对和业务相关。

    随时控制任务ID的完成和接取,他用任务的原因就是他有利益,任何玩家去操作系统的某一个漏洞的时候都是因为利益,不光是网站或者说移动互联网,原来咱们有刷任务,刷金币,这个时候怎么办?就把任务关掉,不能维护服务器,维护服务器成本太高。

    参考文章 原博瑞游戏CTO 田博辉——MMO游戏服务器性能监控及优化分享-在线文稿

    相关文章

      网友评论

          本文标题:游戏服务器优化总结

          本文链接:https://www.haomeiwen.com/subject/dfybtktx.html