【游戏】服务器性能测试(四) 简单压测工具理论篇

本文涉及的产品
性能测试 PTS,5000VUM额度
简介: 做了一个简单的压测交互关系,对服务器压测需要大量的“真实”用户,每个用户都是独立与服务器进行协议通信。首先压测工具需要有网络模块的支持,目前大部分的游戏网络通信是基于TCP协议的,也有一些是基于UDP协议的。其次同时需要支持这么多用户运行,就需要考虑多线程模块。最后就是压测所需的并发控制与事务统计等功能。 1. 网络编程 压测的用户数会需要很多,少则三五千,多则上万。图1的用户与socket比例为1:1可以看出,创建socket的对象数量也会很大,而实际压测中很多情况下用户与socket比例可能会更高。

【游戏】服务器性能测试(四) 简单压测工具理论篇


目录


【游戏】服务器性能测试(一)阈值


【游戏】服务器性能测试(二)架构容灾


【游戏】服务器性能测试(三) 性能指标


一、前言


   前面几期已经介绍了压测需要考虑的内容包括服务器的架构是怎样的、服务器承载指标有哪些、有做过哪些阈值防范等等。这期开始着手尝试介绍压测工具需要的知识点和设计思路。


二、压测工具设计思路


640.png

图1


   图1做了一个简单的压测交互关系,对服务器压测需要大量的“真实”用户,每个用户都是独立与服务器进行协议通信。首先压测工具需要有网络模块的支持,目前大部分的游戏网络通信是基于TCP协议的,也有一些是基于UDP协议的。其次同时需要支持这么多用户运行,就需要考虑多线程模块。最后就是压测所需的并发控制与事务统计等功能。


   1. 网络编程


       压测的用户数会需要很多,少则三五千,多则上万。图1的用户与socket比例为1:1可以看出,创建socket的对象数量也会很大,而实际压测中很多情况下用户与socket比例可能会更高。因此网络编程就需要做好socket维护与管理工作,并且还需要具备高效率。最基础的可以采用I/O多路复用模型select对socket读写进行管理,其代码如下:


# 注意select中放socket列表有一个上限,大概默认值是1024,可以修改
rbuf, _, _ = select.select([sock1,sock2,sock3,.....],[],[])
handler_all_active_sock(rbuf)


       在Windows系统平台可以采用完成端口(IOCP)高并发模型替代select,在Linux系统平台下则可以使用epoll来替代。


   2. 多线程


       上面采用select模型时,默认只支持1024个socket对象,但是实际中创建的socket对象远远超过这个值,因此就需要分多个线程,每个线程里面保存一定数量的socket来规避这个问题如图2。虽然select模型的上限值可以修改,但select采用的是轮询的方式来判断每个socket是否可以读写,如果里面放入过多的socket对象,轮询就会带来一定的效率问题,另外每个socket读取数据也需要一定的耗时,如果放一个队列里面就会造成读取延时。


640 (1).png

图2


       是否可以对每个socket开辟独立的线程来进行读写呢?其实线程数并不是越多越好,线程过多就会产生过多的线程切换,从而会消耗CPU资源,一般总线程数建议不超过CPU核数*2。这块可以考虑使用线程池的设计方式。


   3. 并发控制


       将创建的用户放在一个队列里面,按照并发步长,每秒选取指定数量的用户执行并发请求,由于本身并发的消耗并不高,一般采用一个并发线程。遍历选取的用户列表每个用户执行一次协议数据请求即可如图3。


640 (2).png图3


   4. 事务响应时间统计


       每个用户在发送协议请求时记录下当前的时间(精确到毫秒或微妙),等待服务器返回结果后,计算出这次请求的耗时从而得到事务的响应时间如图4。可以看出事务响应时间包含了网络传输,服务器内部逻辑处理两部分。实际压测中一般保持压测工具与服务器在同一个局域网,从而减少网络延迟带来的数据影响。


640 (3).png


图4

       通过统计所有用户的事务响应时间,计算出平均响应时间,然后通过TPS=并发数/平均响应时间,即可得到该事务在当前并发下的TPS值。


   5. 维持心跳


       游戏客户端与服务器通常是长连接,在执行并发的时候并不会同时让所有用户一起发送协议请求给服务器,而是按照指定的并发,轮询分组选择指定数量的用户进行协议请求,其他用户则等待。但是服务器是不允许长期不活跃的用户存在,一般超时后就会主动断开这个连接,所有想要每个用户都可以保持正常在线,需要维持心跳,而且正式环境中每个客户端也是会与服务器保持心跳连接。


   以上总结为下图5,并发线程控制每秒的用户并发,网络线程池用来管理每个用户的网络通信,定时器线程用于做一些特殊的业务,例如心跳维持。事务统计模块则根据用户的请求处理响应进行记录。


640 (4).png

图5



三、工具开发中的一些难点


   1. 业务流程梳理


       游戏客户端与服务器通常是长连接,例如压测一个在商场购买物品的接口,首先需要将用户登录进入游戏,也就是跟客户端一样,从登录开始一步一步与服务器通讯,直到成功进入游戏后,才可以进行商场购买物品接口压测。因此对每个接口场景进行压测前,首先必须了解这个场景的流程情况,前置条件,判定接口完成条件等。


   2. 网络通信复杂


       压测的每个用户的流程必须与“真实”客户端接近,因此必须包含协议加解密,协议序号维持等。另外用户个人接口压测相对简单,但是涉及多人业务例如组队,联盟公会,匹配战斗等场景流程复杂,涉及面广,同时还必须保证在高并发下压测工具的业务逻辑能够正常运行。


       广播相关业务压测需要高用户在线,压测工具必须保持多用户在线以及处理过高网络数据的压力,不过这类业务可以取巧来减少压力,就是少量用户并发压测,并在另一台机器上登录在线被广播的用户从而保证整体在线用户和并发压力。


   3. 健壮的网络层


       正是由于网络通信的复杂情况,假设网络线程本身是多线程的,线程同步问题又比较难弄,因此要写一个稳定健壮的网络底层需要花一定的时间。同时网络层还必须支持TCP和UDP两套协议,以保证适用不同的业务需求。


   4. 业务与底层分离


       压测框架基本上可以复用,但业务逻辑会根据不同的游戏而变化,因此也需要做到框架与业务分离,以在不同的项目中可以复用。这样就需要确认哪些是通用的,哪些则是当前压测游戏业务独有的,将变化的抽出来提供通用接口,封装不变的内容。从而达到框架的多项目适用性。


四、后记


   这期主要介绍理论相关的东西,文字量有点多,如果真的想做好游戏服务器压测的话,还需要多花时间学习与实践,只有通过不断的尝试才能最终完成适合自己的压测工具。


欢迎微信搜索"游戏测试开发"关注一起沟通交流。

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
相关文章
|
3天前
|
网络协议 测试技术 Apache
测试Netty高并发工具
测试Netty高并发工具
12 3
|
3天前
|
人工智能 自然语言处理 测试技术
基于LangChain手工测试用例转接口自动化测试生成工具
本文介绍利用大语言模型自动生成接口自动化测试用例的方法。首先展示传统通过HAR文件生成测试用例的方式及其局限性,随后提出结合自然语言描述的测试需求与HAR文件来生成更全面的测试脚本。通过LangChain框架,设计特定的提示词模板,使模型能够解析测试需求文档和HAR文件中的接口信息,并据此生成Python pytest测试脚本。示例展示了正常请求、非法请求及无效路径三种测试场景的自动化脚本生成过程。最终,整合流程形成完整代码实现,帮助读者理解如何利用大模型提高测试效率和质量。
14 2
|
19天前
|
弹性计算 运维 云计算
云服务器 ECS产品使用问题之如何把本地的游戏存档上传到在线游戏服务器
云服务器ECS(Elastic Compute Service)是各大云服务商阿里云提供的一种基础云计算服务,它允许用户租用云端计算资源来部署和运行各种应用程序。以下是一个关于如何使用ECS产品的综合指南。
|
19天前
|
弹性计算 缓存 Linux
云服务器 ECS产品使用问题之如何修改游戏参数
云服务器ECS(Elastic Compute Service)是各大云服务商阿里云提供的一种基础云计算服务,它允许用户租用云端计算资源来部署和运行各种应用程序。以下是一个关于如何使用ECS产品的综合指南。
|
12天前
|
关系型数据库 MySQL OLTP
性能工具之 MySQL OLTP Sysbench BenchMark 测试示例
【8月更文挑战第6天】使用 pt-query-digest 工具分析 MySQL 慢日志性能工具之 MySQL OLTP Sysbench BenchMark 测试示例
52 0
性能工具之 MySQL OLTP Sysbench BenchMark 测试示例
|
20天前
|
jenkins 测试技术 持续交付
探索自动化测试的边界:从工具选择到持续集成
【7月更文挑战第30天】自动化测试在软件开发生命周期中扮演着越来越重要的角色,它不仅提高了测试效率,还确保了软件质量的稳定性。然而,自动化测试并非一劳永逸的解决方案,它需要精心规划、选择合适的工具,并持续地集成到开发流程中。本文将探讨如何根据项目需求挑选合适的自动化测试工具,以及如何将这些工具无缝集成到持续集成/持续部署(CI/CD)流程中,以最大化自动化测试的效益。
16 2
|
20天前
|
弹性计算 Linux 云计算
云服务器 ECS产品使用问题之如何访问游戏路径
云服务器ECS(Elastic Compute Service)是各大云服务商阿里云提供的一种基础云计算服务,它允许用户租用云端计算资源来部署和运行各种应用程序。以下是一个关于如何使用ECS产品的综合指南。
|
18天前
|
安全 数据库连接 数据库
可靠性测试-故障注入工具
【7月更文挑战第19天】可靠性测试中的故障注入工具对评估系统容错性与稳定性至关重要。常见工具如 **FaultInjector** (模拟多类故障)、**Xception** (针对特定组件注入错误) 和 **Chaos Monkey** (验证云环境下系统弹性) 帮助开发者提前发现潜在问题, 优化系统设计, 如电商公司通过测试确保促销期稳定, 金融机构降低交易风险。选择合适工具并结合业务场景测试对提升可靠性至关重要。
|
19天前
|
弹性计算 Linux 数据安全/隐私保护
云服务器 ECS产品使用问题之如何迁移游戏数据
云服务器ECS(Elastic Compute Service)是各大云服务商阿里云提供的一种基础云计算服务,它允许用户租用云端计算资源来部署和运行各种应用程序。以下是一个关于如何使用ECS产品的综合指南。
|
20天前
|
弹性计算 运维 云计算
云服务器 ECS产品使用问题之幻兽帕鲁服务器在游戏和计算巢远程都无法连接,该怎么办
云服务器ECS(Elastic Compute Service)是各大云服务商阿里云提供的一种基础云计算服务,它允许用户租用云端计算资源来部署和运行各种应用程序。以下是一个关于如何使用ECS产品的综合指南。