性能测试的一个关键是保证测试结果可靠、可重复,那应该怎么做到这一点呢?
测试规划
详细记录测试环境和测试过程
这些测试环境信息包括什么呢?大体上是操作系统和程序的版本号,以及各种软件参数的设置等等。
记录测试环境的目的是为了以后的各种分析。比如我们如果发现两次测试结果不匹配,需要找到不匹配的原因,那么这些测试环境就是相当关键的信息。如果两次测试结果的不同是因为软件配置不同导致的,根据记录的测试环境信息,我们就很容易根因出来。
至于如何记录,我们可以去手工去记录,但最好是自动记录
快速的复位测试环境
有时候性能测试需要重复进行多次,那么就需要在每一次测试后,能够有快速“复位”到初始测试环境的机制。这个复位机制越简单有效越好,最好能达到所谓“一键复位”的程度,从而最大限度地降低手工复位的工作量。
足够的负载请求和数据
性能测试需要流量负载以及相关的数据,我们需要特别注意保证它们的多样化和代表性。否则测试结果会严重失真。
当使用相同的测试数据进行重复测试时,如果负载请求不够大,那么各种缓存可能会影响结果。
那么如何识别缓存的影响呢?
各级缓存系统都有响应的统计指标和命令,比如文件系统缓存和SAN缓存中的缓存命中率,就可以根据统计信息报告中的延迟,并且结合经验来识别。举个例子,如果一个随机8KB或者16KB数据对硬盘的读写,测量出来的延迟不到1ms,那就实在是“太快”了,快得让人不敢相信;可以肯定它是命中某种缓存了。
那么如何清空缓存呢?
一个现代计算机系统中往往有很多种缓存,比如数据库缓存、文件系统缓存、存储缓存(比如 SAN)等。不同种类的缓存自然有不同的清空方式
- 对于数据库缓存,在每个测试之前可以用命令行来刷新数据库缓存;如果数据库不提供这样的命令,则需要重新启动数据库。
- 对于文件系统缓存,一般需要重新启动服务器。
- 对于 SAN 缓存,可以考虑在测试期间减少甚至关闭缓存,或者用大量的随机数据来“污染”缓存。
除了合理清空缓存外,更有效的方式是保证测试时间足够长,测试的负载请求足够多和数据足够多样化,从而最大限度的减少或者掩盖缓存等其他因素的影响。
测试进行
测试规划之后,我们就要关注测试中的变化了。
性能数据日志要适当输出
性能测试的过程中,也需要实时输出有关的性能数据和日志,比如CPU使用率数据。这些数据对于测试完成后的分析极为重要。
输出的数据和日志最好保存起来,以方便后期处理 / 重新处理
输出数据的多少也需要注意,虽然我们希望尽量多地输出,但是也要意识到,太多的输出有时候会起反作用。
- 存储的开销:可以用压缩存储来解决
- 数据处理时间的开销:注意压缩和解压缩也需要时间
- 可能影响性能测试的结果:有时候因为某些原因,日志输出会影响被测系统的性能,比如往一个文件写入日志,可能会导致系统的暂停,从而影响测试的结果
测试环境要稳定
性能测试的环境在测试进行过程中,以及重复测试时一定要保持稳定和一致,否则测试结果就不可靠或者不能重复。
一般的解决方案,是尽量在一个独立无干扰的环境中进行测试,加上每次测试都准确地恢复测试环境,就能最大限度地保证测试环境的稳定。
一次调一个参数的利弊
在性能调优测试中,就是通过实验来找出系统的最优配置。
对这种测试,我们经常听到的经验是,“一次只调一个参数,通过对比实验,就能知道这个参数的最佳值“。你觉得这个经验对吗?
我们先看这个经验的出发点。性能调优过程中有很多可调参数和配置,互相之间的影响不清楚,因此不宜对系统的各种参数进行随意的改动。应该以基本参考设置为基础,逐次根据实际测试结果进行优化,一次只对某个领域进行性能调优,并且每次只改动一个设置和参数,避免其他参数和相关因素的干扰。
这个经验有它的道理,但我觉得这样做既对也不对,你不能盲从,否则就会错过最优配置的机会。
结果分析
根因分析要从易到难
从最明显的性能瓶颈来开始,往往可以事半功倍。
- 首先从最常用的几种资源和几个指标查,比如CPU使用率、存储IO繁忙度、内存大小、网络发送和接收速度等
- 进一步的分析就可以针对不太明显的资源,比如内存带宽、缓存命中率、线程加锁解锁等;从而过渡到应用程序和系统的一些配置参数。这些配置参数包括应用服务器以及中间件,操作系统瓶颈、数据库、web服务器的配置;还有应用业务瓶颈,比如 SQL 语句、数据库设计、业务逻辑、算法、数据等。
几种测试最好互相验证
各种性能测试工具和测试手段都有自己的局限性或缺陷,从而可能会造成测试结果出现偏差。所以,如果条件和时间允许,最好使用几种不同测试工具或手段,分别进行独立的进行测试,并将结果相互比较和验证。
如果几种测试比较后结果相似,那么皆大欢喜。
否则就需要进行深入比较分析,弄明白造成结果不同的原因。分析以后,如果能够清楚地了解根因并作出合理解释,那么很多时候就够了,可以止于此。最后形成结论时,只要稍加有针对性地说明就可以。
测试结果和生产环境比较
如果性能测试是在非生产环境中进行的,那么得出的测试结果或许会和生产环境大相径庭。如果我们测试的目的是尽量和生产环境一致,就需要仔细审查每个测试的环节,包括测试环境和测试流程。