性能测试
通过自动化的测试工具,模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。
目的:评估系统的能力、发现系统的瓶颈、系统调优、验证稳定性和可靠性。
性能测试包括负载测试、强度测试、容量测试等。
- 负载测试:负载测试是指在超负荷环境下,程序是否能够正常运行(能否在指定时间内超负荷运行)。
- 强度测试:也叫压力测试。指在系统资源特别低的情况下,软件系统的运行情况(检查系统能承受的最大压力,即崩溃点)。
- 容量测试:系统处于最大负载状态或某项指标达到所能接受的最大阈值下对请求的最大处理能力。 测试维度包括负载、内存、磁盘 IO 延时、磁盘使用率、网络使用率等。
性能测试指标
- 并发用户数:用来度量服务器并发容量和同步协调能力。可以理解成一批用户同时执行一个操作。并发数反映了软件系统的并发处理能力。
- 响应时间:指客户端发出请求到得到响应的整个过程所经历的时间。
响应时间=客服端发起请求+网络传输时间+服务处理时间
- 吞吐量:指单位时间内系统处理的客户请求数量。直接体现软件的性能承载能力。
- 资源利用率:指系统资源的使用程度。包括 CPU 利用率、内存利用率、磁盘利用率、网络宽带利用率和 JVM 利用率等。
性能测试的流程
需求分析
- 测试需求分析。
准确:性能指标准确可度量;一致:对术语的理解要一致;特定:在指定的前提条件下关键参数达标;
- 制定测试计划
测试设计
- 测试脚本编写
- 测试脚本调试
- 测试场景设计
测试执行
- 测试环境搭建
测试服务器必须要与实际服务器硬件一致;
操作系统和软件版本要与实际服务器一致;
- 测试场景部署
- 测试场景执行
结果分析
- 测试结果分析
- 性能瓶颈分析
- 测试报告评估
测试指标估算
- 估算并发数:
: 平均的并发用户数 : 平均每天访问用户数 : 一天内用户从登录到退出的平均时间(登录回话的平均时间) : 考察时间长度。 - 并发用户数峰值:
(泊松分布估算) : 用户峰值; : 并发数
估计并发数和并发用户数峰值计算示例
假设系统平均每天有 4000 个用户访问系统。每个用户从登录到退出平均时间为 2 小时,一天中只有 8 个小时会使用该系统。
重点术语
吞吐量:指在一次性能测试过程中网络上传输的数据量的总和,也可以这样说在单次业务中,客户端与服务器端进行的数据交互总量。
吞吐率(
TPS(Transaction Per Second):每秒事务数,指服务器在单位时间内(秒)可以处理的事务数量,一般以request/second为单位。
QPS(Query Per Second):每秒查询率,指服务器在单位时间内(秒)处理的查询请求速率。
RT/ART(Response Time/average Response Time):指一个事务花费多长时间完成。
响应时间在之前有一个 258 原则:响应时间在 2 秒时会有 90% 的人满意,而响应时间到了 8 秒时只有 50% 的满意。(80 年代的调查)
现代的观点表明,0.1s 是最理想的响应时间,1s 是较好的响应时间,4秒是业务响应的上限,10秒完全不可以接受。
TT(Thinking Time):思考时间,在性能测试中,模拟用户的真实操作场景。用户操作的事务与事务之间是有一定间隔的,引入这个概念是为了并发测试(有交叉业务场景)时,业务场景比率更符合真实业务场景。
使用 JMeter 进行性能测试
JMeter 分布式部署
什么是分布式
把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给多个计算机进行处理,最后把这些计算结果综合起来得到最终的结果。
利用控制机与远程压力机组成压力机集群对服务器进行压测。
- 配置远程机器和控制机的
jmeter.properties
中的server_port
属性,以及server.rmi.ssl.disable=true
。 - 配置控制机的
jmeter.properties
中的remote_hosts
属性ip:port
多个使用逗号分割。 - 使用
jmeter-server
启动远程机器和控制机。
安装插件
使用 Plugin Manager 安装 jpgc - Standard Set
插件集合。
聚合报告
- 异常:🌟 取样器执行异常率。
- 响应时间: 平均值、中位数、百分位(X% Line)、最小值:最大值:
X% Line 表示百分之X的样本不超过的响应时间。中位数可以说是 50% Line。
- 吞吐量:以每秒/分钟/小时的请求数来衡量。
- 样本:具有相同 Label 请求的次数。
- 接收 KB/sec:以每秒接收的 KB 数测量的吞吐量。
- 发送 KB/sec:以每秒发送的千字节数测量的吞吐量。
服务器性能监控
使用的是 PerfMon 插件,包含在 jpgc
中。
使用
- 在服务器中部署 ServerAgent
- 添加监听器:jp@gc - PerfMon Metrics Collector
- 添加服务器 Monitor
⚠️ 对于现代技术来说已经非常过时了
由于它依赖 SIGAR 库来收集指标,而该库的最新更新是在 2010 年,因此 ServerAgent 无法在许多现代系统上运行。
可以使用 Prometheus 代替
梯度压力测试
关键点:使用 jp@gc - Stepping Thread Group
,逐步添加用户线程,
配置
THis group will start ___最终的线程数___
threads: First, wait for ___启动等待时间___
seconds; Then start ___首次启动的线程数___
threads; Next, add ___每一次要新增的线程数___
threads every ___新增线程间隔时间___
seconds, using ramp-up ___新增的线程在多少秒内启动完成___
seconds. Then hold load for ___添加完所有线程后继续运行时间___
seconds. Finally, stop ___每次停止的线程数___
threads every ___每次停止的间隔___
seconds.