简介:
性能测试的概念有很多,这里不展开说明,此文章只介绍使用Jmeter如何进行相关性能测试。
JMeter压测的核心原理
基于各种协议,通过多线程的方式来模拟并发用户,设计各种场景来模拟真实的用户负载
JMeter运行在java虚拟机上的,基本原理是建立一个线程池,通过线程组驱动多线程,多线程运行sampler产生负载
参考文档:【JMeter】JMeter的工作原理_jmeter工作原理-CSDN博客
LoadRunnerLoadRunner既支持多进程模拟,也支持多线程模拟
JMeter
JMeter通过多线程的方式来模拟大量并发用户数
一、创建线程组
性能测试创建线程常用的有2种:Thread Group(普通线程)、jp@gc - Stepping Thread Group(混合场景)
1.1、Thread Group(普通线程)
参数解释:
线程数:设置发送请求的用户数目 即虚拟用户数,此处的线程数不等于每秒并发请求数; Ramp-up period:每个请求发生的总时间间隔,单位是秒。
循环次数:保持默认;除非按照明确指定的次数压测,即可指定明确次数;一般压测正式开始我们会勾选永远,然后通过调度器来控制脚本压测时间。
延迟创建线程直到需要:不用勾选
调度器:勾选---通过其控制压测时间,比如压测5分钟,则填入300s;
启动延迟:主要用于延迟多少时间后启动压测脚本,默认不使用;
注意:
多个线程的默认执行顺序是随机
线程组中-调度器使用
1.2、jp@gc - Stepping Thread Group(混合场景)
参数解释:
第1行:这个线程组将参数最大多少线程数。 一般的项目,设置为几百 到1000就够了。
第2行:等待 xxx 秒启动
第3行:启动 xxx 线程 -----起始值为xxx
第4-5行:用5秒钟,累加10个线程,然后,每个线程都运行30秒。
第6行:所有的线程 都产生了之后,一起运行xx时间
第7行:每xx秒,停止xx个线程
二、接口并发-同步定时器
同步定时器(Synchronizing Time)又可称之为“集合点”
在性能测试中,尤其是抢购/抢红包/秒杀活动业务等某时段集中访问场景,需要模拟多用户集中并发测试,此时需要用到同步定时器(Synchronizing Timer)
参数解释:
- Name:定时器名称,可根据用户需要自己填写。
- Number of Simulated Users to Group by:设置同步的线程数量。当设置为0时,等同于线程组中设置的用户数量,当设置为20时,即当用户达到20时同时释放,当设置的数量大于线程数时,设置无效(数量不可设置为大于线程组中的线程数)。
- Timeout in milliseconds:超时时间,单位为毫秒。当设置为0时,即当用户数量达到了设置的数量时则释放,否则一直等待,当设置为300毫秒时,则当时间达到300毫秒时,就释放已经集合的线程,不再等待
注意事项
-
设置的值不能大于线程组 数量
-
最好的情况是 【线程组】 可以被 【用户组】整除
-
超时时间以毫秒为单位:指定人数 多少毫秒没集合到算超时
-
超时时间是0则无限等待,如果是大于0,则未达到集合的【用户组】数量,会在超时后执行
三、建立资源监控
当压测脚本在 本地(wind\mac) 上调试成功后,在我们正式开始压测之前,我们会提前设置好监控的指标,接下来我们来添加资源利用率监控插件
类型及作用
聚合报告
jp@gc - PerfMon Metrics Collector--监控服务器资源
Transactions per Second:显示TPS插件
Response Times Over Time:响应时间插件(RT)
jp@gc - Active Threads Over Time:活动线程数
jp@gc - Transactions per Second:每秒事务数,系统每秒处理请求次数,单位是次/秒。
3.1、聚合报告
添加路径:线程组->添加->监听器->聚合报告(Aggregate Report)
字段解析(响应时间单位:毫秒)
1)Label:每个Jmeter的element都有一个Name属性,这里显示的就是Name属性的值
2)#Sample:表示你这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100
3)Average:平均响应时间-默认情况下是单个Request的平均响应时间当使用了Transaction Controller 时,也可以以Transaction为单位显示平均响应时间
4)Median:中位数,50%用户的响应时间
5)90%Line:90%用户响应时间
6)Min:最小响应时间
7)Max:最大响应时间
8)Error%:本次测试中出现错误的请求的数量/请求的总数
9)Throughput:吞吐量-默认情况下白石每秒的请求数
10)KB/sec:每秒从服务器端接收到的数据量
如何得出最佳性能指标?
-
500线程 和 3000线程,500线程每次增加300个线程,持续压测得出最佳的吞吐量,此时线程数就是最佳
3.2、监控服务端硬件参数(cpu/内存等)
使用插件:jp@gc - PerfMon Metrics Collector
PerfMon Metrics Collector:即服务器性能监控数据采集器。在性能测试过程中,除了监控TPS和TRT,还需要监控服务器的资源使用情况,比如CPU、memory、I/O等。
该插件可以在性能测试中实时监控服务器的各项资源使用。
使用PerfMon Metrics Collector插件,需下载一个服务端插件ServerAgent,并在被测试服务器上启动
使用步骤:
1、添加“jp@gc - PerfMon Metrics Collector”监听器
2、启动ServerAgent服务:
Windows环境:
将下载好的ServerAgent解压,进入目录,双击ServerAgent.bat启动;
linux/Mac环境:
将下载好的ServerAgent上传至服务器,解压并进入目录,执ServerAgent.sh启动,默认使用4444端口4444端口一般会开启失败,执行以命令更换开启端口
java -jar ./CMDRunner.jar --tool PerfMonAgent --tcp-port 8085 --udp-port 8085
3、运行jmeter查看监听结果
总结获取结果步骤:
1. 目标服务器上启动服务 startAgent
2. 添加一个目标服务器上的接口请求即压测接口
3. 添加 Jp@gc-Perfmon Metrics Collector
4. 设置线程组运行为永远(单次运行或运行时间不长,插件获取不到目标服务器指标数据)
5. 关闭本机上的所有杀毒软件
6. 运行测试计划/线程组,查看图表结果
3.3 其它监控插件
常用的插件:
1. Transactions per Second:显示TPS插件
2. Response Times Over Time:响应时间插件(RT)
3. jp@gc - Active Threads Over Time:活动线程数
4. jp@gc - Transactions per Second:每秒事务数,系统每秒处理请求次数,单位是次/秒。
插件介绍文章:
1、jp@gc - Transactions per Second:显示tps插件
jmeter聚合报告中吞吐量,就相当于TPS/QPS/HPS;
一般情况下,用TPS来衡量整个业务流程,用QPS来衡量接口查询次数,用HPS来表示对服务器单击请求
Jmeter内的聚合报告内可以看到平均吞吐量,通过jp@gc - Transactions per Second可以查看某时间点的吞吐量
2、Response Times Over Time:响应时间插件(RT)
在聚合报告中可以查看平均值,详细内容,添加-监听器-jp@gc - Response Times Over Time
3、jp@gc - Active Threads Over Time:用户活动线程数
查看不同时间的活动用户数量
注意:
可以通过聚合报告中样本数+Active Threads Over Time + 施压机器(硬件使用率)+ 网络带宽 ,来判断施压机器是否达到最大性能,以及是否达到网络带宽上限;
可以考率分布式压测 或调整网络带宽
3.4 本地查看插件结果
执行压测试,一般都是使用命令行(非GUI)形式,我们添加的监控插件就无法查看了(实时监控);
这时插件就是只能成为压测完,用于总结作用了;判断性能瓶颈、以及是否需要调整施压数据
查看插件结果
第一步:下载.jtl文件
使用命令执行完后生成jtl文件,找到它下载到本地
第二步:本地jmeter引用查看
首先打开本地jmeter(GUI)-->新建对应插件-->然后通过路径找到jtl文件
四、命令行运行jmeter
使用GUI运行,是非常消耗性能的,一般会使用命名行运行jmeter进行测试
jmeter环境配置:Jmeter环境安装(超级简单)-CSDN博客
4.1 非GUI运行jmeter生成测试报告
jmeter -n -t file.jmx -1 result.jtl -e -o 存放报告文件名
参数说明
-
-n 非gui方式运行jmeter
-
-t :jmx 脚本路径
-
-l :result.jtl 运行结果保存路径,注意:.jtl 文件名不能重复,文件夹需要存在
-
-e :在脚本运行结束后生成 HTML 报告
-
-o :用于存放 HTML 报告的目录,文件夹需要存在
Linux/Mac系统
#Linux系统: 进入到Jmeter bin目录下运行
./jmeter.sh -n -t xx.jmx -l xx.jtl -e -o xx/dirname
#Mac系统: 进入到Jmeter bin目录下运行
./jmeter -n -t xx.jmx -l xx.jtl -e -o xx/dirname
Windows系统
# 进入到Jmeter bin目录下运行
jmeter.bat -n -t xx.jmx -l xx.jtl -e -o xx/dirname
# 示例:
jmeter.bat -n -t D:\桌面\jmeter_code\本地项目1.jmx -l D:\桌面\jmeter_code\res.jtl -e -o D:\桌面\jmeter_code\report
运行如图:
4.2 分布式命令
-r:表示启动所有的远程压力机
-R:指定特定的远程压力机执行测试(多台用,号隔开)
jmeter -n -t HTTP-001.jmx -l res.jtl -e -o reports -r
jmeter -n -t HTTP-001.jmx -l res.jtl -e -o reports -R 59.110.220.52:8899
分布式执行压测文章:
https://zhuanlan.zhihu.com/p/516064194