游戏测试 游戏服务端性能测试

A_Jian · 2023年08月21日 · 最后由 skottZy 回复于 2023年11月18日 · 9921 次阅读

导语:近期经历了一系列的性能测试,涵盖了 Web 服务器和游戏服务器的领域。在这篇文章中,我将会对游戏服务端所做的测试进行详细整理和记录。需要注意的是,本文着重于记录,而并非深入的编程讨论。在这里,我将与您分享这段时光的见闻,希望能够为您呈现一个全面而有趣的视角,谢谢您的关注。

引言

为什么要做游戏服务器的性能测试?想想平时有没碰到哪些宕机卡顿场景。说不定就是服务器引起的。

  1. 用户体验保障: 游戏服务器性能直接影响玩家的体验。如果服务器性能不足,游戏可能会出现延迟、卡顿、掉线等问题,影响玩家的乐趣,甚至可能导致玩家流失。

  2. 稳定性验证: 在高并发情况下,游戏服务器可能会面临各种挑战,如峰值负载、请求堆积等。性能测试可以验证服务器在不同负载情况下的稳定性和可靠性,帮助开发人员发现潜在的问题并加以解决。

  3. 服务器容量规划: 通过性能测试,开发团队可以了解服务器在不同负载下的性能表现,从而做出合理的容量规划。这有助于避免服务器过剩或不足的情况,提高资源利用效率。

  4. 性能优化: 通过性能测试,可以识别服务器性能瓶颈和瓶颈原因。开发人员可以根据测试结果进行针对性的优化,提升服务器的性能和响应速度。

  5. 应对突发情况: 在游戏发布或活动期间,服务器可能会面临突发的用户激增,如推出新内容、举办活动等。性能测试可以模拟这种情况,帮助开发团队准备应对措施,保证服务器在压力下仍能正常运行。

  6. 节省成本: 通过性能测试,可以有效地发现并解决问题,减少后期维护成本。同时,避免了因服务器性能问题引起的用户流失,有助于提高游戏的盈利能力。

技术框架剖析

主要是下面这些,还有进程,线程这些,就不一一列出

编译语言:Python 3.10.9

Python 一直以其简洁和强大而闻名,版本 3.10.9 带来了一系列令人兴奋的特性。我们将在这个框架中体验到这些特性的魅力,从而更高效地实现我们的目标。

强大的库支持

  • Ray: 这个库为我们提供了分布式执行的能力,让我们的任务可以在多个进程和线程中并行执行,从而极大地提高了效率。

  • Pykka: 作为一个轻量级的 Python 库,Pykka 为我们提供了优雅的多线程编程方式,使得线程间的通信和协调变得更加简单。

  • Flask: 作为一个微型的 Web 框架,Flask 不仅简化了我们构建 Web 应用的过程,还为我们提供了扩展性强的组件。

  • Sproto: 这个库让我们能够更加便捷地进行数据的序列化和反序列化,从而在通信过程中更加高效地传递数据。

  • Redis: 作为一个高性能的缓存数据库,Redis 将为我们的应用提供快速的数据访问能力,从而提升整体性能。

施压环境:Ubuntu Docker 容器

在技术的道路上,一个稳定且可控的环境是不可或缺的。我们将在 Ubuntu Docker 容器中搭建我们的实验环境,这将确保我们的测试和分析更加准确可靠。

新手测试场景模拟:探寻导量的奥秘

模拟导量负载,以云服务器为舞台

云服务器 A 上承载了众多游戏服,而云服务器 B 则承载多个中心服和跨服。这里,我们会模拟不同负载情况,为了更好地探索,将以批次的形式进入 N 个游戏服,紧随其后是新手测试,我们将一直持续到特定任务 ID 的终结。

注册、创角、登录,一气呵成

我们的目标是验证注册、创角和登录的表现,按需求,在 1 分钟内承受 2000 的导量,这是我们的挑战。令人欣慰的是,注册、创角和登录的数据显示没有问题,成功率竟然高达 100%!

创角

登录耗时:探寻根源

我们深入挖掘了玩家的登录耗时数据,发现存在一些问题,最长的耗时竟然达到了 35 秒。现在,让我们一起揭开这些耗时长的面纱,找出问题的源头。

登录耗时

统计协议响应时间:优化的关键

为了针对性地优化,我开始统计各种协议的响应时间。通过这些数据,我们可以找到那些耗时较长的环节,并将其交给开发团队进行深入优化。

cost1
cost2

定位问题:再次登录的观察

我们对已经创角的玩家再次登录进行了观察,发现黄色和红色角色都是已创角的。这提示我们可能存在创建角色耗时长的问题。在进一步的调查中,我们发现问题出在了数据写入数据库上,导致了耗时问题。

5

服务器的极限

我持续测试了半小时,观察了游戏服的 CPU 和内存表现。不同公司标准不同,而对于我司,单核 CPU 达到 100%、内存使用 3G,是服务器的承载上限。

CPU内存

探索大型玩法场景的极限

这次,我们将进入一个充满挑战的领域,探索大型玩法场景的负载极限。

打 Boss、互相 PK,还有积分!

在这个玩法中,一群玩家将齐聚于同一场景,迎接着 Boss 的挑战,彼此间展开激烈的战斗,不仅能够互相击杀,还有机会获得积分。直至时间结束,他们会走出场景,留下属于战斗的记忆。这次,我们要测试的是在这样的场景中,服务器和客户端的性能表现。

探索极限:玩家人数的挑战

我们的目标是找到这个场景能够支持的最大玩家人数,让他们在同一场景中展开战斗。接下来,我们将分析性能数据,从中得出场景的负载极限。这将为我们后续的优化和规划提供宝贵的信息。得出一个场景极限后,超出的则分流到多个场景。

极限挑战:从百分之百到百分之二百

这次的标准与之前的新手测试有所不同。在新手测试中,我们的服务器已经达到了百分之百的极限。而在这次的跨服测试中,我们的极限提高到了百分之二百。然而,这个标准的确立并不仅仅取决于服务器资源的分配,还与服务器整体架构紧密相连。寻找服务器和玩家数量之间的平衡点。

CPU

CPU 高负荷:挑战的起因

我们注意到上图 CPU 的异常高负荷与同场景战斗的人数和频繁的战斗逻辑运算有着密切关系。在庞大的人数和频繁的战斗计算下,CPU 不堪重负,面临过载的问题。

协议数据量的统计:探寻数据症结

我们进一步研究了协议数据量,令人惊讶的是,单个机器人仅在 1 分钟内就接收了 4 万条数据。这些海量的数据传输不仅增加了网络负担,也加重了服务器的压力,进一步加剧了 CPU 的过载情况。

proto

挑战与解决:百人战斗的同步

百人同场景战斗所带来的全地图实时同步,确实让服务器承受难以想象的压力。为了解决这个问题,我们采取了局部广播 - 九宫格的策略。这种方式有效地减轻了服务器的负担,让战斗同步变得更加可控。

探索的继续

在这次的技术探索中,我们深入了解了 CPU 过载的原因以及其背后的数据关系。通过切换战斗同步策略,我们正在逐步找到解决之道。技术世界充满了无限的挑战和机会,让我们继续前行,一同探索未知的领域。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 10 条回复 时间 点赞

技术世界充满了无限的挑战和机会,让我们继续前行,一同探索未知的领域。-----单看这句话,很唬人。

我们采取了局部广播 - 九宫格的策略。这种方式有效地减轻了服务器的负担---- 有数据说明么?比如 提升了多少,或者减轻了多少。

LTV 回复

AI 角色口吻 请忽略

LTV 回复

翻了下记录

一分钟 2000?我们的项目一秒钟 500 个登录没有问题。一分钟 4 万协议?我们的压测框架一秒钟就能处理一万条。看你的数据倒是给了我不少信心,原来我设计框架的也很强,对了我的技术是 c++ 嵌套 lua,也是 sproto 协议,好处是服务端客户端的 lua 代码可以拿来直接用

回复

服务器一分钟推送了 4 万条协议给一个玩家,自身和客户端运算造成一些影响,毕竟每一条协议都要进行序列化反序列化和逻辑运算,另外镜头之外的玩家也进行广播,做性能优化的话就没必要广播,毕竟玩家人数越多,服务端和客户端的计算量都是指数级增长;创角登录我司这个项目确实存在瓶颈,还在优化中

A_Jian 回复

我也对类似的项目做过性能测试,也是广播特别多,也是做了九宫格方案的优化,听起来似曾相识,我们还用了 kcp 通信,同场景从 30 多人优化到 100 多,不过后来那个项目中途砍掉了,感谢分享,我有很多游戏服务器性能测试积累,但是不爱写文字

回复

1 秒 500 登录,感觉很难往上突破,有没有可能是限制在创建 socket 链接那里?底层的东西我不是很懂,之前用 python 测 HTTP 请求,也是卡在 500 这个坎。。。另外大佬 1 秒处理 10000 条协议是单个机器人吗?单个机器人 1 秒 1 万协议的处理量也太强了吧,那 500 个机器人同时在线,不是每秒去到 500 万 + 的协议处理量?怎么做到的?机器吃的住吗?😱

碧晓寒枫 回复

每秒登陆 500 个我倒是没有仔细探究瓶颈在哪里,毕竟大多数项目不需要这么高的并发登陆数量。我设计压测工具完全是我自己研发的类似于服务器常用的 actor 架构网络底层,使用毫秒级定时器驱动用户执行,无论模拟多少个用户,线程数量始终等于 CPU 核数,避免使用一个线程模拟一个用户导致线程太多带来线程切换的开销,从而大大提升 CPU 效率

碧晓寒枫 回复

纯 python 不太适合做压测,GIL 的存在导致你只能 fork 进程,虽然说现在 asyncio+uvloop 这一套效率直逼 go,但是也只是单进程,多进程的话本身 pick 也是有开销的,不过可以试试看看。对于 c++ 实现的压测工具来说,500/s 小 case,1w/s 消息处理都不算高

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册