jmeter常用详解
JDK安装配置
1、下载地址:https://www.oracle.com/technetwork/java/javase/downloads/index.html 2、选择对应版本下载 3、安装JDK 4、配置环境变量
Jmeter安装配置
1、下载地址:http://jmeter.apache.org/download_jmeter.cgi
2、选择对应版本下载
3、安装Jmeter(解压缩)
4、启动:Jmeter:${jmeter}/bin/jmeter(windows-bat、linux-sh)
性能测试脚本设计
1、线程组设定-
1.1、“在取样器错误后要执行的动作”:“继续”(执行取样器后面的操作)、“start next thread loop”(执行下次循环,当前循环剩余sampler不再执行)、“停止线程”(停止当前线程,其他线程继续执行)、“停止测试”(执行完剩余线程后停止测试)、“stop test now“(立即停止所有线程)
1.2、线程数:及并发数(可以理解有N个用户同时执行线程组下的动作)
1.3、Ramp-Up Period(in seconds):M秒内启动N个线程
1.4、循环测试:勾选“永远”-不断请求、未勾选“永远”&循环测试L-每个线程请求L次
1.5、Delay Thread creation until needed:直到需要的时候创建线程
1.6、调度器:开启后可以设置持续时间、启动延迟、启动时间、结束时间
2、setUp线程组&tearDown线程组
2.1、setUp线程组:在线程组下面可以做一些初始化操作如执行获取token接口并将token参数化以供后续线程组使用,又比如操作数据库可以进行数据库连接操作
2.2、tearDown线程组:在线程组下面可以做一些clear操作比如数据库连接关闭
3、常用请求设定
3.1、Http请求-Get请求:输入协议-HTTP、服务IP、端口、方法-Get、路径、文本编码
3.2、Http请求-Post请求:无入参,输入协议-HTTP、服务IP、端口、方法-POST、路径、文本编码
3.3、Http请求-Post请求:with Parameters,输入协议-HTTP、服务IP、端口、方法-POST、路径、文本编码、Parameters
3.4、Http请求-Post请求:with Body,输入协议-HTTP、服务IP、端口、方法-POST、路径、文本编码、Body数据
3.5、Http请求-Post请求:upload file,输入协议-HTTP、服务IP、端口、方法-POST、路径、文本编码、Parameter、上传文件(本地路径+入参名称+文件MIME(Multipurpose Internet Mail Extensions)类型)
3.6、Http请求-Header&Cookies等设定
3.7、JDBC请求:添加mysql连接插件 -> 新增jdbc connection configuration:连接名称x、url、驱动、账号、密码 -> 添加sampler/jdbc请求:连接名称x、动作、sql
4、参数化设定
4.1、函数助手
4.2、用户定义的变量
4.3、截取字段赋参
4.3.1、引用名称:定义一个变量
4.3.2、正则表达式.*<匹配规则>.*下图示例 开始字符-"token":"、结束字符-"、截取中间部分字符串
4.3.3、模版$1$表示选取第一次符合正则表达式的字符串
4.3.4、匹配数字:0代表随机取值,1代表全部取值
4.3.5、正则表达式无匹配项,则用该值
4.4、CSV Data Set Config
4.4.1、Filename:本地文件路径
4.4.2、File encoding:文件编码格式
4.4.3、设置变量,","隔开
4.4.4、Ignore first ... :忽略第一行,即从第二行取值
4.4.5、分列符号:根据造的数据区别,分列后第一列对应了variable names的第一个值,第二列对应了variable names的第二个值
4.4.6、Recycle on EOF:参数化数据取完后,是否循环取值
4.4.7、Sharing mode:给哪些线程用
5、断言设定:从哪个地方获取响应字段、设置匹配规则、预期内容
6、查看结果树、聚合报告等监听
6.1、查看结果树:写入文件查看、显示正确/错误日志、配置显示字段、搜索结果、是否模糊匹配、结果列、结果数据
6.2、聚合报告
6.2.1、Label:Sampler的名称
6.2.2、Samples:请求次数
6.2.3、Average:平均响应时长
6.2.4、Median/90%/95%/99%:50%/90%/95%/99%请求的响应时长低于该值
6.2.5、Min/Max:最小/大响应时长
6.2.6、Error%:错误率
6.2.7、ThroughPut:TPS,每秒完成事务数量
6.2.8、Received/Sent KB/s:每秒接收/发出字节大小
性能测试实例介绍
1、性能测试项目背景
1.1、业务:新零售项目有5w多台机器通过请求handler服务获取网关信息,并保持上线长连接,机器每天凌晨会重启&gateway网关服务发布引起近万台机器重连&服务出现异常再恢复后机器重连
1.2、目的:确保机器快速上线
1.3、拆分后的性能需求:handler获取网关信息接口TPS满足性能需求&handler服务稳定运行、gateway握手上线接口TPS满足性能需求&gateway服务稳定运行
2、性能测试场景梳理:
2.1、模拟x用户并发y小时请求handler服务获取网关接口
2.2、模拟x用户并发y小时请求gateway服务上线长连接
3、性能测试环境搭建&测试数据准备
3.1、性能测试环境搭建:尽可能靠近生产环境
3.2、测试数据准备:
vem.vem_machine表造2w台机器
参数化数据shark.csv:握手协议、机器编号、ipcId
4、压测工具选型&脚本设计(本次演示使用jmeter)
4.1、请求handler获取网关接口的压测脚本设计
4.1.1、点击测试计划右键添加线程组:
“在取样器错误后要执行的东西”:“Start Next Thread Loop”
“线程数”:“1000”
“Ramp-Up Period”:“1”
“循环次数”:“永远”
4.1.2、选择线程组右键添加-Sampler-HTTP请求
“协议”:“HTTP”
“服务器名称或IP“:”10.213.6.203“
“端口号”:“80”
“方法”:“POST”
“路径”:“/vem-handler/gateWayController/getGateWayAddress”
“Content encoding”:“UTF-8”
“Parameters“-”ipcId“:”${ipcId}“ ---- ${ipcId}是个变量
4.1.3、选择HTTP请求Sampler右键添加-配置元件-CSV Data Set Cofing
“FileName”:“/Library/jmeter_project/shark.csv”
"File encoding":“UTF-8”
“Variable Names”:“vmId,ipcId”
“Delimiter”:“\t”
“Recycle on EOF”:“True”
“Sharing mode”:“All Thread”
4.1.4、选择HTTP请求Sampler右键添加-断言-响应断言
“要测试的响应字段”:“响应文本”
“模式匹配规则”:“包括”
“要测试的模式”:
"resultCode":1200
"vmId":"${vmId}"
"ipcId":"${ipcId}"
4.1.5、选择线程组右键添加-监听器-查看结果树
4.1.6、选择线程组右键添加-监听器-聚合报告
4.2、请求gateway上线长连接接口的压测脚本设计
4.2.1、点击测试计划右键添加线程组:
“在取样器错误后要执行的东西”:“Start Next Thread Loop”
“线程数”:“1000”
“Ramp-Up Period”:“1”
“循环次数”:“永远”
4.2.2、选择线程组右键添加-配置元件-CSV Data Set Cofing
“FileName”:“/Library/jmeter_project/shark.csv”
"File encoding":“UTF-8”
“Variable Names”:“shark,vmId,ipcId”
“Delimiter”:“\t”
“Recycle on EOF”:“True”
“Sharing mode”:“All Thread”
4.2.3、选择线程组右键添加-Sampler-TCP取样器
“服务器名称或IP“:”vem-gateway1-test.nfsq.com.cn“
“端口号”:“4201”
“End of Line byte value”:“10”(换行的意思)
“要发送的文本”:“${shark}(后面跟一个回车键)”
4.2.4、选择TCP取样器右键添加-断言-响应断言
“要测试的响应字段”:“响应文本”
“模式匹配规则”:“包括”
“要测试的模式”:
"resultCode":1
4.2.5、选择线程组右键添加-逻辑控制器-循环控制器
“循环次数”:“永远”
4.2.6、选择循环控制器添加-Sampler-TCP取样器
“服务器名称或IP“:”vem-gateway1-test.nfsq.com.cn“
“端口号”:“4201”
“End of Line byte value”:“10”(换行的意思)
“要发送的文本”:
{"h":"${vmId}"}
4.2.7、选择循环控制器添加-定时器-固定定时器
“线程延迟(毫秒)”:“10000”
4.2.8、选择线程组右键添加-监听器-查看结果树
4.2.9、选择线程组右键添加-监听器-聚合报告
4.3、模拟机器上线场景:根据请求handler获取的网关ip、port去进行上线长连接的压测脚本设计
4.3.1、点击测试计划右键添加线程组:
“在取样器错误后要执行的东西”:“Start Next Thread Loop”
“线程数”:“1000”
“Ramp-Up Period”:“1”
“循环次数”:“永远”
4.3.2、选择线程组右键添加-配置元件-CSV Data Set Cofing
“FileName”:“/Library/jmeter_project/shark.csv”
"File encoding":“UTF-8”
“Variable Names”:“shark,vmId,ipcId”
“Delimiter”:“\t”
“Recycle on EOF”:“True”
“Sharing mode”:“All Thread”
4.3.2、选择线程组右键添加-Sampler-HTTP请求
“协议”:“HTTP”
“服务器名称或IP“:”10.213.6.203“
“端口号”:“80”
“方法”:“POST”
“路径”:“/vem-handler/gateWayController/getGateWayAddress”
“Content encoding”:“UTF-8”
“Parameters“-”ipcId“:”${ipcId}“
4.3.3、选择HTTP请求Sampler右键添加-断言-响应断言
“要测试的响应字段”:“响应文本”
“模式匹配规则”:“包括”
“要测试的模式”:
"resultCode":1200
"vmId":"${vmId}"
"ipcId":"${ipcId}"
4.3.4、选择HTTP请求Sampler右键添加-后置处理器-正则表达式处理器
“要检查的响应字段”:“主体”
“引用名称”:“ip”
“正则表达式”:“.*"ip":"(.+?)".*”
“模版”:“$1}$
“匹配数字”:“1”
“缺省值”:“vem-gateway1-test.nfsq.com.cn“
4.3.5、选择HTTP请求Sampler右键添加-后置处理器-正则表达式处理器
“要检查的响应字段”:“主体”
“引用名称”:“port”
“正则表达式”:“.*"port":(.+?)}.*”
“模版”:“$1}$
“匹配数字”:“1”
“缺省值”:“4201“
4.3.6、选择线程组右键添加-Sampler-TCP取样器
“服务器名称或IP“:”${ip}“
“端口号”:“${port}”
“End of Line byte value”:“10”(换行的意思)
“要发送的文本”:“${shark}(后面跟一个回车键)”
4.3.7、选择TCP取样器右键添加-断言-响应断言
“要测试的响应字段”:“响应文本”
“模式匹配规则”:“包括”
“要测试的模式”:
"resultCode":1
4.3.8、选择线程组右键添加-逻辑控制器-循环控制器
“循环次数”:“永远”
4.3.9、选择循环控制器添加-Sampler-TCP取样器
“服务器名称或IP“:”${ip}“
“端口号”:“${port}”
“End of Line byte value”:“10”(换行的意思)
“要发送的文本”:
{"h":"${vmId}"}
4.3.10、选择循环控制器添加-定时器-固定定时器
“线程延迟(毫秒)”:“10000”
4.3.11、选择线程组右键添加-监听器-查看结果树
4.3.12、选择线程组右键添加-监听器-聚合报告
5、执行脚本&结果查看
5.1、本地执行:点击启动按钮
5.2、远程启动(调度机、压力机):确保网络互通,防火墙不禁止
5.2.1、远程压力机安装jdk+jmeter
5.2.2、修改jmeter/bin/jmeter.properties
server.rmi.ssl.disable=true
5.2.3、确保jmeter脚本、参数化文件和调度机存放路径一致
5.2.4、启动jmeter/bin/jmeter-server.sh
5.2.5、获取jmeter-server启动分配的ip、port
5.2.4、调度机修改jmeter/bin/jmeter.properties
remote_hosts=ip1:port1,ip2:port2(压力机的)
5.2.5、启动jmeter/bin/jmeter.sh
5.2.6、打开脚本,点击运行-远程启动-选择压力机启动
5.3、查看结果树
查看运行结果是否成功
5.4、聚合报告
“Label”:“Sampler名称”
“Samples”:“请求数”
“Average”:“平均响应时长”
“Median”:“中间位,50%的请求响应时间不超过该值”
“90%Line”:“90%的请求响应时间不超过该值”
“95%Line”:“95%的请求响应时间不超过该值”
“99%Line”:“99%的请求响应时间不超过该值”
“Min”:“最小响应时长”
“Max”:“最大响应时长”
“Error%”:“错误率”
“ThroughPut”:“TPS”
“Receive KB/sec”:“每秒接收数据大小”
“Send KB/sec”:“每秒发送数据大小”
5.5、错误日记查看:点击右上角⚠️按钮查看
6、数据监控,jmeter支持添加插件来监控服务器性能指标,不过个人建议使用性能监控平台+性能工具的方式获取,如zabbix、top、free、jstack、nmon、nload、sar、netstat等
7、结果分析,大致以下几点:
7.1、RT:Response Time,响应时间
7.2、TPS:transaction per second,每秒处理事务量,TPS=并发量/RT
7.3、CPU:cpu lod、cpu utilities等
7.4、Memory:可用内存、已用内存、buffer、cache等,其中java应用还要考虑新生代、老年代、持久代
7.5、磁盘IO:读/写能力
7.6、Network IO:发送/接收能力
7.7、Java Thread:各个状态及数量-New、Runnable、Blocked、Waiting、Timed_waiting、Terminated
7.8、容错率:多倍压力下允许业务能力下降,但不允许服务挂死

浙公网安备 33010602011771号