性能测试
通常意义上来说,性能测试分为客户端性能和服务端性能。但在分别介绍这两项工作内容之前,有些通性的规律可以先跟大家说一下。
性能测试的基本思路
首先是判断是否存在性能问题,问题可能出在哪里。最直观的例如客户端运行时是否有卡顿,比较隐晦就是通过程序架构或工作经验进行猜测。尽量对性能问题的描述进行量化,例如内存消耗不能高于多少,响应时长要在多少秒之内等等。
思考如何触发性能问题,例如如何增加程序运行时的压力。需要借助一些工具,或需要找开发人员帮忙开发工具。
搭建环境,测试和收集性能数据,记录过程中出现的问题现象,然后对数据结果进行分析。要先将问题现象和数据表现整理好,然后有条理地找开发人员进行核对。
在开发人员完成性能优化后,重新用相同的测试环境和方法验证调优后的效果和数据。
性能测试的几种方式——思路与最下面的方案有重叠的部分,思考下如何重新整理
- 冒烟测试:只针对有修改的部分进行测试,验证修改效果的正确性。
- 基准测试:建立一个标准,或者找到竞品,用同样的测试方法或流程与之对比,找到自身需要优化的点,评估潜在的风险。
- 压力测试:模拟正式的负载环境,然后看系统的响应情况,验证系统的稳定性。
- 负载测试:不断加压,直到系统成功率或响应时间低于预期值,评估系统的最大承载能力。
- 隔离测试:其实就是通过分解模块,不断缩小问题范围的方式,可以认为是冒烟测试的深入版。
- 渗透或稳定性测试:某个重要逻辑反复执行,查看是否可能出现缓慢的内存泄漏最终导致系统不可用。
目前工作中最常用的就是性能测试方法就是基准和压力测试。以前只有在测试客户端引擎的时候,才用到压力、隔离和渗透测试。而冒烟测试更多的是结合自动化工作内容。
常见的性能问题
一般来说,程序的性能开销主要分为CPU密集型和IO密集型两种。因为程序的运行简单可以分为三个步骤:读取数据,进行计算,输出结果。所谓的CPU密集型就是指程序运行的时间中,进行计算比读取数据和输出结果占得比例要大的多,表现的现象就是CPU高,IO低;而IO密集型刚好相反,此时CPU低,而IO高。但共同的表现都是程序响应时间变长,给人一种延迟感。日常常见的性能问题主要如下,这里分为客户端和服务端两方面,之后会再详细介绍如何去进行测试。
客户端:
- 加载的资源过多,且旧资源不能及时释放,占用的内存越来越多。
- 一次性加载的资源过大,比如加载很大的地图场景,短暂性卡顿。
- 画面绘制量大,显示的单位过多,尤其是3D项目,像骨骼动作、动画播放这些会占据较多的CPU,而模型贴图和特效元素这些会消耗大量的GPU。
- 客户端收发大量的消息,例如聊天消息,同步同屏玩家行为等。
- 后台在处理一些别的逻辑,比如边玩边下载更新。
服务端:
- 单进程,所有的功能模块都集中在一个进程上,不能充分利用linux的多核性能。
- 加载和搜索较大的配置表。
- 大量、频繁地读写数据库:比如服务端程序刚启动,需要加载很多数据,同时加载的数据还要进行初始化运算等;还有服务端程序关闭时,要把当前所有在线玩家的数据都写入数据库;还有同一时间有大量玩家登录,这些操作,都会使得服务端程序就会同时发出大量的数据库查询和更新。
- 全服广播,例如发送聊天消息,全服玩家发送邮件。
- 刷新排行榜。
- 大量的战斗计算。
除了上述内容,像代码逻辑问题,如死循环,无序查找也会引发性能问题,还有最常见的网络延迟,倒不是说网络延时会导致客户端服务端自身卡顿,而是有可能延迟后,客户端某个瞬间收到大量的包,客户端程序来不及处理,导致卡顿甚至卡死。
性能测试方案
在开始性能测试前,要先有一个预计的方案,就像测试用例那样,有明确的测试目标,执行步骤和预期结果。当然性能问题不像功能问题那么简单直接,很难从一开始就确定上面三点,所以也可以先直接按正常流程跑一下,看下有没有哪里有明显的性能问题,比如卡顿,响应延迟等。然后针对暴露出来的问题,再制定更具有针对性的测试方案。
实际的测试工作中,测试很少有机会直接接触到程序代码,即便能够接触到,想要通过测试手段去准确清晰地定位到性能问题也是不容易的。因为:
首先,很少有性能问题能一次性解决的,大多都是耦合在一起的问题,难以定位。
其次,对代码不熟悉,而直接通过阅读代码定位问题需要很深的代码功底,也要大量的时间。最熟悉当然还是写这些代码的程序,所以性能测试一定要跟程序同学密切合作。最好在测试之前,就能够先跟程序同学核对一下测试方案,请其帮忙一起进行评估,提出可能有问题的点来验证。确认预期结果后,用测试结果进行比对,再跟程序核对,一步步定位问题,有时甚至要用不同的流程,不同的版本多次重复的进行性能测试。
需要注意的是:
目前几乎没有性能测试工具可以在记录性能数据的同时,记录下程序运行时的行为,最多只能记录下代码接口的调用。所以性能测试过程中,还需要测试者自己观察和记录过程中发现的问题,然后再通过时间轴与性能数据进行对比,帮助分析和定位问题。
要做好历史数据的记录和整理。性能测试很少从单一的数据上进行评断,除非是有明显的问题,例如内存泄漏,失败率过高等。一般都是纵向地与自身历史数据进行对比,或是横向与竞品进行对比,结果会更加简单明了。
接下来会分别介绍客户端性能测试和服务端性能测试常见的方法,并结合日常工作中的实例进行说明。