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

本文涉及的产品
性能测试 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进行规格选择与性能压测。
相关文章
|
2月前
|
前端开发 测试技术 Python
【Selenium全攻略】掌握这一工具,实现自动化测试的所有梦想
本文分享了使用Selenium进行UI自动化测试的全过程,包括开发环境部署、代码实现、思路分析和难点解析。作者通过一个实际案例,讲述了如何利用Selenium处理前端生成报告失败的问题,以及在UI自动化中定位元素和处理元素不唯一的情况。同时,文章强调了解决问题思路的重要性,鼓励读者开拓思维,寻找不同的解决方案。
93 4
【Selenium全攻略】掌握这一工具,实现自动化测试的所有梦想
|
21天前
|
缓存 Java 测试技术
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
使用JMeter对项目各个接口进行压力测试,并对前端进行动静分离优化,优化三级分类查询接口的性能
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
|
16天前
|
测试技术
基于LangChain手工测试用例转App自动化测试生成工具
在传统App自动化测试中,测试工程师需手动将功能测试用例转化为自动化用例。市面上多数产品通过录制操作生成测试用例,但可维护性差。本文探讨了利用大模型直接生成自动化测试用例的可能性,介绍了如何使用LangChain将功能测试用例转换为App自动化测试用例,大幅节省人力与资源。通过封装App底层工具并与大模型结合,记录执行步骤并生成自动化测试代码,最终实现高效自动化的测试流程。
30 4
|
1月前
|
监控 安全 Linux
如何利用Kali Linux进行网站渗透测试:最常用工具详解
如何利用Kali Linux进行网站渗透测试:最常用工具详解
70 6
|
1月前
|
测试技术 C# 图形学
掌握Unity调试与测试的终极指南:从内置调试工具到自动化测试框架,全方位保障游戏品质不踩坑,打造流畅游戏体验的必备技能大揭秘!
【9月更文挑战第1天】在开发游戏时,Unity 引擎让创意变为现实。但软件开发中难免遇到 Bug,若不解决,将严重影响用户体验。调试与测试成为确保游戏质量的最后一道防线。本文介绍如何利用 Unity 的调试工具高效排查问题,并通过 Profiler 分析性能瓶颈。此外,Unity Test Framework 支持自动化测试,提高开发效率。结合单元测试与集成测试,确保游戏逻辑正确无误。对于在线游戏,还需进行压力测试以验证服务器稳定性。总之,调试与测试贯穿游戏开发全流程,确保最终作品既好玩又稳定。
47 4
|
1月前
|
安全 Linux 测试技术
Kali Linux预装的自动化渗透测试工具
Kali Linux预装的自动化渗透测试工具
43 2
|
2月前
|
测试技术
基于LangChain手工测试用例转Web自动化测试生成工具
该方案探索了利用大模型自动生成Web自动化测试用例的方法,替代传统的手动编写或录制方式。通过清晰定义功能测试步骤,结合LangChain的Agent和工具包,实现了从功能测试到自动化测试的转换,极大提升了效率。不仅减少了人工干预,还提高了测试用例的可维护性和实用性。
47 4
|
2月前
|
消息中间件 Kafka 测试技术
【Azure 事件中心】使用Kafka的性能测试工具(kafka-producer-perf-test)测试生产者发送消息到Azure Event Hub的性能
【Azure 事件中心】使用Kafka的性能测试工具(kafka-producer-perf-test)测试生产者发送消息到Azure Event Hub的性能
|
2月前
|
测试技术 API
软件测试:Postman 工具的使用。开发及测试均需要掌握的测试工具
这篇文章详细介绍了Postman工具的各个模块功能,包括创建请求、集合、环境、自动化测试等,并解释了如何使用Postman进行GET、POST、PUT和DELETE等常见HTTP请求的测试。
|
2月前
|
Java Spring UED
Spring框架的异常处理秘籍:打造不败之身的应用!
【8月更文挑战第31天】在软件开发中,异常处理对应用的稳定性和健壮性至关重要。Spring框架提供了一套完善的异常处理机制,包括使用`@ExceptionHandler`注解和配置`@ControllerAdvice`。本文将详细介绍这两种方式,并通过示例代码展示其具体应用。`@ExceptionHandler`可用于控制器类中的方法,处理特定异常;而`@ControllerAdvice`则允许定义全局异常处理器,捕获多个控制器中的异常。
38 0
下一篇
无影云桌面