游戏云服务器推荐的技术梳理

游戏云服务器推荐的技术梳理

游戏服务对云服务器的需求,本质上和普通web服务有很大不同。普通网站服务大多是间歇性的请求响应,用户打开页面之后就会断开连接,偶尔丢失几个数据包,用户刷新页面就能解决,对延迟和持续负载的要求不高。但游戏服务不一样,只要玩家在线,连接就会一直保持,服务端需要实时处理每个玩家的输入,同步所有玩家的状态,对计算的及时性、网络的稳定性要求都高很多。很多人找游戏云服务器推荐的时候,没理清这个区别,选出来的机器总是达不到预期。

第一个常见的误区,就是盲目堆核心数量,忽略CPU的主频参数。我接触到的大部分游戏服务端,核心逻辑都运行在单线程上,毕竟所有玩家的状态都需要统一同步,很难把核心逻辑拆到多个线程并行处理。这种情况下,CPU的单核心性能比核心总数重要得多。我之前碰到过一个开发者,做小型多人联机游戏,为了划算选了16核低主频的云服务器,结果刚到30个玩家在线,主逻辑线程就跑满了,游戏开始出现卡顿,其他15个核心的使用率还不到10%。后来调整成8核高主频的配置,一百个玩家在线都能保持稳定。从这件事就能看出来,选型的时候选错了优先级,再多资源也用不上。

第二个常见误区,就是选配置的时候只看计算资源,完全不关心网络的规格。游戏对网络的要求,不止是延迟够低,还要看带宽的方向和抖动控制。很多做过网站的开发者都习惯,网站服务主要消耗下行带宽,因为服务端要给用户传输网页、图片这些内容,上行只需要处理用户的请求,数据量很小,所以买带宽的时候大多优先保证下行。但游戏服务刚好反过来,服务端需要把所有玩家的状态同步给每个在线玩家,上行流量会远大于下行流量。举个简单的例子,一百个玩家同时在线,每个玩家每秒给服务端发送大概1KB的操作数据,服务端就要给每个玩家发送将近100KB的全玩家状态数据,总的上行流量就会超过10MB每秒,如果上行带宽不够,就会出现数据包排队延迟,直接导致游戏卡顿甚至掉线。

除了带宽,网络抖动也是很容易被忽略的点。很多人只看平均延迟,觉得平均延迟在100ms以内就没问题,但如果延迟波动大,一会50ms一会300ms,玩家体验会比平均延迟200ms还要差,会出现人物漂移、技能释放延迟这些问题,哪怕平均延迟不高,玩家也会觉得服务器卡。所以测试网络的时候,不能只测一次延迟,要长时间观测波动情况。

不同规模的游戏场景,对云服务器的要求差别很大,找游戏云服务器推荐的时候,要先明确自己的使用场景,不能直接照搬别人的标准。

第一种场景是个人开发测试,也就是开发者做游戏原型,几个人到十几个人联机调试。这种场景对性能的要求不高,毕竟同时在线的人少,主要需要注意两个点:第一是要有稳定的公网IP,方便开发人员从外部连接进来测试;第二是要确认常用的游戏端口没有被限制,很多云服务厂商会默认封锁一些常用的非业务端口,如果没提前确认,搭好服务之后才发现连不上,还要额外提交申请解封,耽误不少时间。这种场景不用追求太高的配置,够用就好,没必要提前浪费资源。

第二种场景是小型社区联机服,也就是几十人到几百人的私人服或者小型社群服。这种场景除了前面说的主频和上行带宽,还要额外注意两个点:第一是存储的稳定性,这类服务器大多要长期存储玩家的存档数据,如果存储性能不稳定出现数据损坏,整个服务器的玩家都会流失,很难恢复,所以尽量选稳定性有保障的存储介质,不要为了省资源用性能太差的存储;第二是基础的流量防护,这类小型公开的服务器,偶尔会碰到异常流量攻击,把整台服务器的上行带宽打满,导致所有玩家掉线,所以提前要有基础的防护能力,避免一下子就被打崩。

第三种场景是正式上线的中小规模游戏,同时在线人数从几千到几万不等。这种场景一般不会用单台服务器承载所有玩家,大多会拆成多个游戏进程或者多个节点部署,所以找游戏云服务器推荐的时候,要从集群整体规划的角度来考虑,不能只看单台机器的配置。这里要注意几个点:第一是要看能不能支持弹性扩容,游戏的在线人数往往会有波动,比如新开服的时候人数会暴涨,周末的在线人数比工作日高很多,如果能快速扩容增加机器,就能应对高峰流量,低谷的时候再缩容释放资源,能提高资源的利用率;第二是内网互联的延迟,不同的游戏节点之间要同步玩家数据、跨服匹配,如果内网延迟高,就会导致同步不及时,出现跨服卡顿的问题,所以内网的稳定性和延迟也要重点测试;第三是完善的监控告警能力,正式上线的服务不能随时盯着,要有监控能实时采集CPU、内存、带宽、延迟这些指标,出问题的时候能及时通知负责人处理,避免小问题变成大故障,影响玩家体验。

除了上面说的大方向,还有几个小细节,很多人选型和部署的时候都会漏掉,最后出了问题才发现,这里也整理一下。

第一个是安全组和防火墙的配置。很多人要么为了方便把所有端口都放开,留下安全隐患,要么就是开错了端口。比如很多游戏用UDP协议传输实时数据,如果安全组把UDP端口关掉,玩家根本连不上;还有跨节点部署的时候,忘记开服务器之间内网通信的端口,导致跨服同步失败。我之前帮人排查游戏连不上的问题,差不多有一半都是安全组配置错了,这个坑看起来简单,但是很多人都会踩。

第二个是时间同步。很多人觉得这个是小事,不值得关注,但游戏服务端很多逻辑都依赖系统时间,比如定时活动的开启关闭、排行榜的刷新、数据的存档间隔,如果服务器的时间不对,整个逻辑都会乱掉。大部分云服务器默认会开时间同步,但也有部分默认配置不对,部署完之后最好手动检查一下时间对不对,配置好NTP同步服务,避免出现奇怪的逻辑bug。

第三个是资源隔离。如果同一台云服务器上部署了多个不同的游戏服,一定要做好资源限制,不能让某个服因为异常占满了整台机器的CPU、内存或者带宽,连累其他的服一起出问题。用系统自带的资源限制工具就能实现,不用复杂的配置,但是很多人嫌麻烦不做,最后出了问题才后悔。

还有一个常见的误解,就是很多人觉得游戏云服务器推荐一定要选专门定制的特殊机型,普通机型用不了。其实从实际使用来看,大部分中小型游戏场景,常规的计算型或者通用型云服务器就能满足需求,只有一些极端场景,比如万人同屏的交互、实时渲染的云游戏,才需要特殊配置的机型。不用盲目追求特殊定制,先算清楚自己的需求,再选对应的配置就可以。

我自己整理的一个简单的判断流程,大概是这样:第一步先估算自己的同时在线人数,算出大概需要的计算资源和上行带宽,确定一个最低的配置标准,不要盲目选太高的配置浪费资源,也不要选太低的不够用;第二步先拿测试机部署,实际跑两三天,连续观测高峰期的资源使用率、延迟和抖动,确认符合需求之后再正式迁移;第三步不管是什么规模的服务,一定要定期备份数据,存档和配置都要备份,这个是最省心的保障。