概述
为什么要做性能测试
性能测试主要是为了达到以下目标
- 评估系统能力: 了解系统的处理能力,帮助系统决策。如作为柔性有损的参数参考。
- 识别系统中的弱点: 了解系统的瓶颈在哪里。
- 系统调优: 改进性能。(这是一个迭代开发、重复测试的过程)
- 验证系统稳定性和可靠性: 避免系统因为突发流量而引发故障。结合应用场景,评估系统性能是否满足需要。
性能术语
- TPS: Transactions Per Second, 单位时间能够处理完毕的事务。(事务服务器,如SQL的Insert、Update、Delete操作)
- QPS: Query Per Second, 单位时间内能够处理完毕的查询。(查询服务器,如数据库的query操作)
- PV: Page View, 页面访问量或点击量
- RT: Response Time, 响应时间
- UV: Unique Visitor 独立访客数(一天内访问服务的客户端数量)
性能测试的评价指标
(下面很多指标术语在不同的语境下可能会有不同的含义,在评价性能指标时,通常是指他们能够达到的最优值。比如吞吐量是指服务能承受的最大吞吐量。)
吞吐量 与 TPS、QPS
吞吐量,在后台服务中是指单位时间内成功处理完毕的请求数量。
根据后台服务的场景,吞吐量通常可以通过TPS、QPS和并发数反应。
吞吐量可以进一步细分:
- 平均吞吐量: 一段时间内的吞吐量的平均值。
- 峰值吞吐量: 一段时间内的吞吐量的最大值。
- 最低吞吐量: 一段时间内的吞吐量的最小值。
- 70%吞吐量集中区间: 通过统计15%和85%的吞吐量边界值,计算出70%的吞吐量集中区间。区间越集中,吞吐量越稳定。
并发用户数
并发用户数时值系统可以同时承载的用户数量。
用户要正常使用Web服务通常需要与服务端建立至少一条连接,而服务端能够接受的连接数是有限制的,因而并发用户数通常也是反映系统性能的重要指标。
响应时间
响应时间是指系统对请求做出响应的时间。对于单个用户来说,响应时间与用户体验密切相关。
响应时间也可以做细分:
- 平均响应时间:一段时间内响应时间的平均值。无法体现响应时间的波动情况。
- 中间响应时间:一段时间内响应时间的中间值,50%响应时间,有一半的服务器响应时间低于该值而另一半高于该值。
- 90%响应时间:一段时间内90%的事务响应时间比此数值要小。反应总体响应速度,和高于该值的10%超时率。是用来评估系统容量的重要指标之一。
- 最小响应时间:响应时间的最小值。反映服务最快处理能力。
- 最大响应时间:响应时间的最大值。反映服务器最慢处理能力。
CPU占用率和内存占用率
CPU占用率和内存占用率反应了系统资源的使用情况。
如果系统的CPU占用率很低,则可能是系统没有充分利用资源(可以考虑通过多进程、多线程技术优化)。当然也可能是因为本身并发请求量较低。
如何做性能测试
常用性能测试方法
根据测试的指标,可以分为以下几种:
- 稳定性测试: 测试在未过载场景下,系统长期运行能否正常工作。(稳定性测试需要评估下现实场景的负载和并发量,测试时的负载、并发量不应过低,否则测试就失去了意义)
- 负载测试: 递增施加负载压力, 获取系统在不同负载下的性能指标。
- 并发测试: 调节并发请求量,获取系统能够承受的并发请求量。
根据测试的手段,可以分为以下几种:
- 压力测试: 对系统施加压力,可以分成暴力测试和稳定性测试,分别对应时间维度和空间维度。(暴力测试:施加过载压力,评估系统过载时的风险。稳定性测试:测试在未过载场景下,系统长期运行能否正常工作。)
- 基准测试: 特定标准条件下的测试。指定时间条件或负载条件。
- 容量测试: 根据负载测试的指标,评估系统的容量。
常见的性能测试工具
Webbench
http://home.tiscali.cz/~cz210552/webbench.html
Loadrunner
https://software.microfocus.com/en-us/products/loadrunner-load-testing/overview
Apache ab
http://httpd.apache.org/docs/2.4/programs/ab.html
性能测试工具的基本实现原理
性能测试工具主要通过增加对服务器的负载和并发数来实现性能测试。
- 改变负载: 性能测试工具要尽可能快的发出请求包。收到被测服务的响应后随即发送下一次请求。这样的结果就是被测服务处理多快,我们的测试工具就能请求多快。
- 改变并发数: 并发数主要通过建立多个tcp连接来实现,可以利用多线程、多进程技术,各个进程分别与服务端建立socket连接,从而模拟并发用户。
使用性能测试工具时需要确认性能测试工具自身的运行环境是否会对测试结构产生影响。(比如客户端的负载已经达到瓶颈,而服务端还没有。)
如果性能测试工具自身环境(如网络环境等)会影响测试数据,则不能使用客户端的统计数据作为测试结构。而可以考虑在不同的环境中运行多个性能测试工具,然后采用服务端的统计数据。