04. JMeter性能测试的技术要点
04. JMeter性能测试的技术要点
1. 定时器
1. 同步定时器
为什么要使用同步定时器?
- 如何模拟1w人同时使用电商网站 ?
- 如何模拟1w人同时进行电商网站中的抢购活动/秒杀活动 ?
- 如何模拟1000人同时抢红包?
同步定时器
阻塞线程(累积一定的请求),当在规定的时间内、达到一定的线程数量,这些线程会在同一个时间点一起释放,瞬间产生很大的压力。
测试抢购、秒杀或者抢红包等高并发的场景时使用
提示:在JMeter中叫做同步定时器,在Loadrunner中又叫集合点
位置
测试计划 --> 线程组--> HTTP请求 --> (右键添加) 定时器 --> Synchronizing Timer
使用同步定时器的操作步骤?
- 添加线程组,设置线程数为n
- 添加HTTP请求
- 添加同步定时器
- 参数介绍
- Number of Simulated Users to Group by(模拟用户的数量):模拟并发数,即指定同时释放的线程数数量。
- 若设置为0,等于设置为线程组中的线程数量
- 不等于0:达到指定的数量即释放,直到释放完为止
- Timeout in milliseconds(超时时间以毫秒为单位):超时时间,即超时多少毫秒后同时释放指定的线程数
- 建议设置:不设置的话,若没有达到设置的线程数会一直死等
- 如果设置为0,该定时器将会等待线程数达到了设置的线程数才释放,若没有达到设置的线程数会一直死等。
- 不能设置太小:等待时间后还没达到设置的线程数,会释放已到达的线程
- 如果大于0,那么如果超过Timeout in milliseconds中设置的最大等待时间后还没达到设置的线程数,Timer将不再等待,释放已到达的线程。默认为0
- 建议设置:不设置的话,若没有达到设置的线程数会一直死等
- Number of Simulated Users to Group by(模拟用户的数量):模拟并发数,即指定同时释放的线程数数量。
- 参数介绍
- 添加查看结果树
- 添加监听器-聚合报告
演练
1、模拟100个用户同时访问百度首页,统计各种高并发情况下运行情况
操作步骤
添加线程组,设置线程数=100
添加HTTP请求
添加同步定时器,并发数可分别设置20/30人
添加查看结果树
添加监听器-聚合报告
2. 常数吞吐量定时器
为什么要使用常数吞吐量定时器?
- 稳定性测试时,要求模拟用户真实的业务场景。
- 如果用户真实业务场景的QPS为20如何精确模拟 ?
作用
- 让JMeter按指定的吞吐量执行,以分钟为单位。(需要按指定的吞吐量发送请求时,可以使用常数吞吐量定时器)
位置
- 测试计划 --> 线程组--> HTTP请求 --> (右键添加) 定时器 --> Constant Throughput Timer
使用常数吞吐量定时器的操作步骤?
添加线程组,循环次数设置成永远
添加HTTP请求
添加常数吞吐定时器
参数介绍
- Target throughput(in samples per minute):目标吞吐量。注意这里是每个用户每分钟发送的请求数
设置目标吞吐量:每个用户每分钟发送的请求数
计算方法:要求QPS * 60 / 线程数
添加查看结果树
添加监听器-聚合报告
案例要求
- 模拟用户真实的业务场景要求:20 QPS
- 如果线程数设置为1,则目标吞吐量设置为 20 * 60 = 1200
- 如果线程数设置为2,则目标吞吐量设置为 20 * 60 / 2 = 600
演练
1、用户以 20QPS (20 次/s) 的频率访问百度首页,持续一段时间,统计运行情况
操作步骤
添加线程组,循环次数设置成永远
添加HTTP请求
添加常数吞吐定时器
- 要求QPS * 60 / 线程数 : 20 * 60 / 2
添加查看结果树
添加监听器-聚合报告
- 查看聚合报告的 Throughput 字段,实际值围绕设置的QPS值上下波动
3. 固定定时器
连续登录失败3次后,1分钟后才能再次登录(模拟6秒)
2. 分布式
为什么要使用分布式?
- 在使用JMeter进行性能测试时如果项目需要支持10000用户并发但是单台电脑只能支持1000个用户并发该怎么处理?
- Apache JMeter - Apache JMeter 分布式测试分步
- 关闭防火墙
- 关闭杀毒软件
- 控制机、代理机必须在同一网段
- 所有机器的Jmeter和Java的版本必须一致
- 关闭RMI SSL开关
JMeter分布式执行原理
- JMeter分布式测试时,选择其中一台作为控制机(Controller),其它机器做为代理机(Agent)。
- 执行时,控制机会把脚本发送到每台代理机上
- 代理机拿到脚本后就开始执行,代理机执行时不需要启动JMeter界面,可以理解它是通过命令行模式执行的。
- 执行完成后,代理机会把结果回传给控制机,控制机会收集所有代理机的信息并汇总。
- JMeter分布式测试时,选择其中一台作为控制机(Controller),其它机器做为代理机(Agent)。
JMeter分布式配置和执行
- 配置 — 修改bin/jmeter.properties文件:
- 代理机(slaves):
- 修改服务端口: 保证每个代理机都能正常启动。如果是在同一台机器上演示需要使用不同的端口,多台机器可以不修改。
- 例如:server_port=2999
- 将RMI SSL设置为禁用。
- 例如:server.rmi.ssl.disable=true
- 修改服务端口: 保证每个代理机都能正常启动。如果是在同一台机器上演示需要使用不同的端口,多台机器可以不修改。
- 控制机(master):
- 配置代理机远程地址:配置每个代理机的IP+port,多个代理机之间用‘,’连接
- 例如: remote_hosts=192.168.182.100:1099,192.168.182.101:2999
- 将RMI SSL设置为禁用。
- 例如:server.rmi.ssl.disable=true
- 配置代理机远程地址:配置每个代理机的IP+port,多个代理机之间用‘,’连接
- 样本数量=线程数*代理机数
- 代理机(slaves):
- 配置 — 修改bin/jmeter.properties文件:
执行
- 代理机(命令行方式启动)
- 进入bin目录,运行jmeter-server.bat文件,启动 JMeter
- 控制机(界面方式启动)
- 进入bin目录,运行jmeter.bat文件,启动JMeter
- 选择菜单:运行-->远程启动/远程全部启动
- 代理机(命令行方式启动)
演练
1、请求:https://www.baidu.com
2、一台控制机和两台执行机,做分布式;要求控制机启动,两台执行机执行,反馈结果
操作步骤:
配置代理机一,并启动
配置代理机二,并启动
配置控制机,并启动
添加线程组
添加HTTP请求 – 百度
添加查看结果树
3. 测试报告
- 为什么需要测试报告?
- 性能测试的各种指标结果如何获取 ?
- 性能测试时间一般比较长,如何获取测试过程中的所有指标数据 ?
1. 聚合报告
作用
- 收集性能测试结束后,系统的各项性能指标。如:响应时间、并发数、吞吐量、错误率等
位置
- 测试计划->右键->监听器->聚合报告
参数介绍
Label:每个请求的名称
样本:各请求发出的数量
平均值:平均响应时间(单位:毫秒)
中位数:中位数,50% <= 时间
90%百分比:90% <= 时间
95%百分比:95% <= 时间
99%百分比:99% <= 时间
最小值:最小响应时间
最大值:最大响应时间
异常%:请求的错误率
吞吐量:吞吐量。默认情况下表示每秒完成的请求 数,一般认为它为TPS
接收 KB/sec:每秒接收到的千字节数
发送 KB/sec:每秒发送的千字节数
补充
- 正常情况下,响应时间的结果取平均值
- 当响应时间最大值特别高(超出平均水平特别多),导致平均值不能代表正常/大部分水平时,可以使用百分比时间
演练
- 1、请求:https://www.baidu.com
- 2、模拟5个用户并发,控制服务器QPS为20,运行时长设置为10分钟
- 3、添加聚合报告,收集系统性能指标:响应时间、吞吐量、错误率、网路速率
2. HTML测试报告
作用
- JMeter支持生成HTML测试报告,以便从测试计划中获得图表和统计信息
命令
- jmeter -n -t [jmx file] -l [result file] -e -o [html report folder]
- eg: jmeter -n -t hello.jmx -l result.jtl -e -o ./report
参数描述
- -n:非GUI模式执行JMeter
- -t [jmx file]:测试计划保存的路径及.jmx文件名,路径可以是相对路径也可以是绝对路径
- -l [result file]:保存生成测试结果的文件,jtl文件格式
- -e:测试结束后,生成测试报告
- -o [html report folder]:存放生成测试报告的路径,路径可以是相对路径也可以是绝对路径
- -r: 启动远程服务,即slave,多台时,可以指定具体那几台,使用: -R 192.168.6.176:1500,192.168.6.177:1700 (分时IP地址)
- jmeter -n -t ./01_分布式执行.jmx -l result.jtl -e -o ./report -R 127.0.0.1:1500,127.0.0.1:1600,127.0.0.1:1700
注意:result.jtl和report会自动生成,如果在执行命令时result.jtl和report已存在,必须用先删除,否则在运行命令时就会报错
演练
- 1、请求:https://www.baidu.com
- 2、模拟5个用户并发,控制服务器QPS为20,运行时长设置为10分钟
- 3、使用命令行的方式运行,并收集HTML测试报告
HTML测试报告
执行完毕后,用浏览器打开生成报告的文件目录下的index文件,效果展示如下
APDEX (应用性能指标):
- APDEX:满意度,范围在 0-1 之间,1表示达到所有用户均满意
- T(Toleration threshold):容忍或满意阈值
- F(Frustration threshold):失败阈值
Requests Summary(请求总结):
- 成功与失败的请求占比,KO指失败率,OK指成功率
Chart(详细信息图表)
- 它包括Throughput(吞吐量) 、Response Times(响应时间)等
- 每秒事务数,即TPS
- Response Times Over Time(脚本运行期间的响应 时间变化趋势图)
- 它包括Throughput(吞吐量) 、Response Times(响应时间)等
小节
1. 聚合报告的核心内容有哪些? - 响应时间、吞吐量、错误率、网路速率 2. JMeter生成html测试报告的命令? jmeter -n -t hello.jmx -l result.jtl -e -o ./report 注意事项: - 如果在执行命令时result.jtl和report已存在,必须用先删除 3. JMeter的HTML测试报告的内容? - 性能统计仪表盘 - 性能测试过程中的详细信息报表
3. jmeter 使用GUI工具生成报告
选择任意一个监视器(查看结果树、聚合报告等),把性能测试结果写入文件
点击jmeter菜单栏中的 tools > Generate HTML report或**[res_key=html_report]** **
4. 性能测试时TPS计算
为什么需要计算性能测试TPS?
- 稳定性测试时需要模拟用户真实负载量,真实负载量是多少?
- 压力测试时需要模拟高负载验证系统的容错能力,高负载有多高 ?
性能测试时的TPS,大都是根据用户真实的业务数据(运营数据)来计算的
运营数据
PV:(Page View)即页面访问量,每打开一次页面 PV计数+1,刷新页面也是。PV只统计页面访问次数。
1. 普通计算方法
- 计算公式
- TPS = 总请求数 / 总时间
- 数据分析
- 根据数据统计,在2019年第32周,日均PV为4.13万,可以估算为1天有4.13万请求(1次浏览都至少对应1个请求) 总请求数 = 4.13 万请求数 = 41300
- 总时间
- 1天 = 1 * 24 小时 = 24 * 3600 秒
- 套入公式
- TPS = 41300请求数/(24*3600秒) = 0.48请求数/秒
- 结论
- 按照普通计算方法,理论上每秒能够处理0.48请求,就可以满足线上的需要。
2. 二八原则计算方法
- 二八原则就是指80%的请求在20%的时间内完成
- 计算公式
- TPS = 总请求数 * 80% / (总时间*20%)
- 套入公式
- TPS =
41300 * 0.8请求数
/ (24*3600*0.2秒
) = 1.91 请求数/秒
- TPS =
- 结论
- 按照二八原则计算,在测试环境我们的TPS只要能达到1.91请求数每秒就能满足线上需要。二八原则的估算结果 会比平均值的计算方法更能满足用户需求。
3. 计算稳定性测试并发量
数据分析
- 根据这些数据统计图,可以得出结论
- 大部分订单在8点-24点之间,因此系统的有效工作时长为16个小时
- 从订单数量统计,8-24点之间的订单占一天总订单的98%左右(40474个)
- 根据这些数据统计图,可以得出结论
结合二八原则计算公式 : TPS = 总请求数 * 80% / (总时间*20%) :
- 需要在测试环境模拟用户正常业务操作(稳定性测试)的并发量为
- TPS =
40474 * 0.8请求数
/16*3600*0.2秒
= 2.81 请求数/秒
- TPS =
- 需要在测试环境模拟用户正常业务操作(稳定性测试)的并发量为
4. 计算压力测试并发量
- 数据分析
- 根据这些数据统计图,可以得出结论:
- 订单最高峰在在21点-22点之间,一小时的订单总数大约为 8853个
- 计算压力测试的并发数:TPS = 峰值请求数/峰值时间 * 系数(系数取决于对未来业务量的评估)
- 需要在测试环境模拟用户峰值业务操作(压力测试)的并发量为
- TPS = 8853 请求数 / 3600秒 * 3(系数) = 7.38 请求数/秒
- 根据这些数据统计图,可以得出结论:
5. 小节
并发数计算方法有哪几种?作用有什么区别?
- 普通方法:
- 并发数TPS = 总请求数/总时间
- 作用:可以满足系统最最基本的应用场景(每天的总请求数)的要求。
- 二八原则:
- 并发数TPS = 总请求数 * 80% / 总时间 * 20%
- 作用:可以满足绝大多数情况下,用户真实的业务场景要求。
- 根据业务运营数据的统计计算(通常用来做稳定性测试)
- 并发数TPS = 有效请求数 * 80% / 有效时间 * 20%
- 作用:可以满足绝大多数情况下用户真实的业务场景要求(当运营数据的统计越精确,计算结果越准确)
- 根据用户峰值业务操作来计算(通常用来做压力测试)
- 并发数TPS = 峰值请求数 / 峰值时间 * 系数
- 作用:专门用于满足极端的用户业务场景下的性能需求
5. Jmeter下载第三方插件
- 为什么需要下载第三方插件?
- JMeter自带监控功能无法监控服务器资源怎么办?
- JMeter自带的报告不能精确统计运行过程中的性能指标变化怎么办 ?
1. 插件管理工具包下载与安装
先下载JMeter插件管理工具包,再用此包下载JMeter插件
下载插件管理包的步骤:
下载包管理工具jar包https://jmeter-plugins.org/
将包管理工具jar包添加到JMeter放入到lib\ext目录下
重启JMeter,可以在选项下看到插件管理器
2. 安装第三方插件的步骤
打开Plugins Manager插件管理器
选择Available Plugins,当前可用的插件
选择需要下载的插件(等待右方文本内容展示出来)
下载右下角的下载按钮,自动的完成下载,JMeter会自动重启
3. 演练
- 安装插件管理包
- 安装如下指定的插件
- 3 Basic Graphs
- 5 Additionally Graphs
- Custom Thread
- GroupsPerfMon
4. 小节
1. 第三方插件的作用?
使用第三方开发的扩展功能
2.第三方插件的下载步骤?
下载插件管理器:
下载包管理工具jar包
将包管理工具jar包添加到JMeter放入到lib\ext目录下
重启JMeter
3.下载第三方插件:
打开Plugins Manager插件管理器
选择Available Plugins,当前可用的插件
选择需要下载的插件(等待右方文本内容展示出来)
下载右下角的下载按钮,自动的完成下载,JMeter会自动重启
6. 性能测试常用图表
1. Concurrency Thread Group 线程组
- 阶梯线程组
- 作用是阶梯加压;图形界面显示运行状态
- 添加方式
- 测试计划 --> 线程(用户)--> Concurrency Thread Group
- 参数介绍
- Target Concurrency:目标并发(线程数、虚拟用户数)
- Ramp Up Time:加速(启动)时间;若设置 1 min,则目标线程在1 imn内全部启动
- Ramp-Up Steps Count:加速步骤计数(阶梯次数);若设置6,则目标线程在 1min 内分六次阶梯加压(启动线程);每次启动的线程数 = 目标线程数 / 阶梯次数 = 60 / 6 = 10
- Hold Target Rate Time:运行时间;若设置 2 ,则启动完所有线程后,持续负载运行 2 min,然后再结束
- Time Unit:时间单位(分钟或者秒)
- Thread Iterations Limit:线程循环次数;默认为空,理解成永远,如果运行时间到达Ramp Up Time + Hold Target Rate Time,则停止运行线程**【不建议设置该值】**
- Log Threads Status into File:日志记录;将线程状态记录到文件中(将线程启动和线程停止事件保存为日志文件)
- 特别注意点
- Target Concurrency只是个期望值,实际不一定可以达到这个并发数,得看上面的配置**【电脑性能、网络、内存、CPU等因素都会影响最终并发线程数】**
- Jmeter会根据Target Concurrency的值和当前处于活动状态的线程数来判断当前并发线程数是否达到了Target Concurrency;若没有,则会不断启动线程,尽力让并发线程数达到Target Concurrency的值
2. Transactions per Second 每秒完成事务数
- Transactions per Second
- 每秒完成事务数
- 作用
- 是统计各个事务每秒钟成功的事务个数
- 添加方式
- 测试计划 --> 线程组--> 监听器-->Transactions per Second
3. Bytes Throughput per Second 每秒字节吞吐量
- Bytes Throughput per Second
- 每秒字节吞吐量
- 作用
- 是查看服务器吞吐流量(单位/字节)
- 添加方式
- 测试计划 --> 线程组--> 监听器-->Bytes Throughput Over Time
4. 演练
1、请求:https://www.baidu.com
2、模拟5个用户并发,控制服务器QPS为20,运行时长设置为10分钟
3、添加性能测试常用图表
5. 小节
1. Concurrency Thread Group 线程组的作用是什么?
- 阶梯加压
- 图形界面显示运行状态
2. Transactions per Second和Bytes Throughput per Second有什么作用?
- Transactions per Second:作用是统计各个事务每秒钟成功的事务个数
- Bytes Throughput per Second:作用是查看服务器吞吐流量
3. Transactions per Second和聚合报告中的TPS在性能测试时的作用有何不同,以哪个为准?
- 性能测试的结果统计,以聚合报告的结果为准(Transactions per Second只是辅助手段)
- 每秒性能指标的作用是:查看系统长时间运行过程中是否有异常出现,有则进一步分析
7. PerfMon组件监控服务器资源
- 作用
- 用来监控服务端的性能资源指标的工具,包括cpu、内存、磁盘、网络等性能数据
- 添加方法
- 线程组->监听器->jp@gc - PerfMon Metrics Collector
- 注意
- 使用之前需要在服务器端安装监听服务程序并启动
- 下载:https://github.com/undera/perfmon-agent
- 使用之前需要在服务器端安装监听服务程序并启动
- 监控服务器资源指标的步骤:
下载安装包ServerAgent-2.2.3.zip,链接地址:https://github.com/undera/perfmon-agent
上传到服务器上,并解压ServerAgent-2.2.3.zip
启动(可以使用宝塔部署)
windows运行startAgent.bat
linux运行
startAgent.sh
指定端口(默认4444):./startAgent.sh --udp-port 0 --tcp-port 3450
宝塔部署
如果启动出现:java: command not found
拷贝:startAgent.sh -> startAgent2.sh 进行修改指定jdk
#!/bin/sh /www/server/java/jdk1.8.0_371/bin/java -jar $(dirname $0)/CMDRunner.jar --tool PerfMonAgent "$@"
修改项目执行文件和执行命令
- /www/wwwroot/tools/ServerAgent/ServerAgent-2.2.3/startAgent2.sh
- /www/wwwroot/tools/ServerAgent/ServerAgent-2.2.3/startAgent2.sh --udp-port 0 --tcp-port 12300
启动这个工具后,jmeter的插件jp@gc - PerfMon Metrics Collector就可以收集服务端的资源使用率,并在 jmeter中查看了
练习
案例一
- 需求
- 启动windows上安装的Tpshop商城项目
- 使用JMeter编写脚本,访问首页,控制运行时间为60s,并同步监控服务器资源指标
- 操作步骤
- 上传ServerAgent-2.2.3.zip到windows服务器上,并进行解压
- 启动ServerAgent程序startAgent.bat
- 添加线程组,配置持续时间为60s
- 添加HTTP请求 – 首页
- 添加PerFMon组件
- 添加聚合报告
- 需求
案例二
- 需求
- 启动linux上安装的Tpshop商城项目
- 使用JMeter编写脚本,访问首页,控制运行时间为60s,并同步监控服务器资源指标
- 操作步骤
- 上传ServerAgent-2.2.3.zip到linux服务器上,并进行解压
- 启动ServerAgent程序startAgent.sh
- 添加线程组,配置持续时间为60s
- 添加HTTP请求 – 首页
- 添加PerFMon组件
- 添加聚合报告
- 需求
小节
1. PerfMon组件的作用? 用来监控服务端的性能资源指标,包括cpu、内存、磁盘、网络等性能数据 2. PerFMon组件监服务器控资源指标的步骤? 1.下载ServerAgent-2.2.3.zip,并上传到服务器上进行解压 2.启动ServerAgent程序 - 如果是windows运行startAgent.bat - 如果是linux运行startAgent.sh 3. 编写JMeter脚本,配置运行时间 4. 添加PerFmon组件 - 服务器IP - ServerAgent程序端口 - 待监控的指标