Jmeter使用及压测
安装
官网地址
http://jmeter.apache.org
1、需要安装JDK8+。
2、启动 bin目录下 jmeter.bat。
注意:如果启动提示 Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5。
解决:用管理员身份运行即可。
3、切换中文
a、控制台临时修改
options -> choose language
b、配置文件永久修改
bin目录 -> jmeter.properties
默认 #language=en
改为 language=zh_CN
使用
1、添加线程组
Test Plan -> Add ->Threads ->Thread Group(控制总体并发)
线程数:虚拟用户数,一个虚拟用户占用一个进程或线程。
准备时长(Ramp-Up Period(in seconds)):全部线程启动的时长,比如100个线程,10秒,则表示10秒内100个线程都要启动完成,每秒启动10个线程。
循环次数(Loop Count):每个线程发送的次数,假如值为5,100个线程,则会发送500次请求。
2、添加Http请求
Thread Group -> Add -> Sampler(取样器) -> Http Request(一个线程组下面可以添加多个Sampler)
web服务器:
默认协议是http
默认端口是80
服务器名称或IP :请求的目标服务器名称或IP地址
路径:请求url,比如 /login
Use multipart/from-data for HTTP POST :当发送POST请求时,使用Use multipart/from-data方法发送,默认不选中。
3、添加察看结果树
线程组/Http Request -> Add -> Listener(监听器)-> View Results Tree(察看结果树)
4、添加断言
线程组/Http Request -> Add -> Assertions(断言)-> Response Assertion(响应断言)
apply to(应用范围):
Main sample only: 仅当前父取样器 进行断言,一般一个请求,如果发一个请求会触发多个,则就有sub sample(比较少用)。
要测试的响应字段:
Text Response(响应文本):即响应的数据,比如json等文本。
Response Code(响应代码):http的响应状态码,比如200,302,404。
Response Message(响应信息):http响应代码对应的响应信息,例如:OK。
模式匹配规则:
contains(包含):只要包含在里面就成功。
Matches(匹配):响应内容完全匹配,不区分大小写。
Equals:完全匹配,区分大小写。
5、添加断言结果监听器
线程组/Http Request -> Add -> Listener(监听器)-> Assertion Results(断言结果)
注意:每个Sampler下面可以加单独的结果树,然后同时加多个断言,最外层可以加个结果树进行汇总。
6、添加聚合报告
线程组/Http Request -> Add -> Listener(监听器)-> Aggregate Report(聚合报告)
lable: sampler的名称。
Samples: 一共发出去多少请求,例如10个用户,循环10次,则是 100。
Average: 平均响应时间,单位ms。
Median: 中位数,也就是 50% 用户的响应时间。
90% Line : 90% 用户的响应不会超过该时间。
95% Line : 95% 用户的响应不会超过该时间。
99% Line : 99% 用户的响应不会超过该时间。
min : 最小响应时间,单位ms。
max : 最大响应时间,单位ms。
Error%:错误的请求的数量/请求的总数。
Throughput : 吞吐量——默认情况下表示每秒完成的请求数(Request per Second) 可类比为QPS。
Received KB/sec : 每秒接收数据量。
Sent KB/sec : 每秒发送数据量。
7、添加用户自定义变量
线程组/Http Request -> Add -> Config Element(配置原件)-> User Definde Variable(用户定义的变量)
引用方式${XXX}。
8、读取CSV和Txt文本文件
线程组/Http Request -> Add -> Config Element(配置原件)-> CSV data set config(CSV数据文件设置)
如果是多个参数需要同时引用,则在CSV数据文件里面设置加多个字段,Variabled names(comma-delitited): csv_name,csv_pwd。
9、if控制器
-
第一个参数:
- Expression (must evaluate to true or false) :表达式(结果值必须是true或false)。在右边文本框中输入的条件值必须是true 或 false。
-
第二个参数:
- Interpret Condition as Variable Expression?:默认勾选项,将条件解释为变量表达式(需要使用__jexl3 or __groovy 表达式)
-
第三个参数:
- Evaluate for all children?:条件作用与每个子节点,默认不勾选。仅在If Controller入口处判断一次
-
第四个参数:
- use status of last sample: 作用就是只有当上一个请求成功后,才会执行if控制器下的请求。
注意:
1、文本框上的黄色感叹号,就是建议采用默认的jexl3 or groovy 表达式,以提高性能。
2、if 控制器 只能作用于其下的子项。
jexl3 or groovy 表达式
jexl3表达式格式
${__jexl3(条件表达式)}
groovy 表达式
${__groovy(条件表达式}
逻辑表达式说明
- ==
- 含义:是否等于
- 示例:如${__jexl3(${VAR}==1,)},判断${VAR}变量是否等于1。
- !=
- 含义:不等于
- 含义:如${__jexl3(${VAR}!=1,)},判断${VAR}变量是否不等于1。
- !
- 含义:非
- 示例:如${__jexl3(!(${VAR}!=2),)},对${VAR}的值不等于2,其判断为真,那么执行IF下的子项。
- &&
- 含义:并且
- 示例:如${__jexl3(${VAR}1 && "${name}" != "李四",)},也就是${VAR}1和表达式 "${name}" != "张四"均为真时,执行IF控制器下的子项。
- ||
- 含义:或
- 示例:如${__jexl3(${VAR}1 && "${name}" != "李四",)},也就是${VAR}1和表达式 "${name}" != "张四"其中一项为真时,执行IF控制器下的子项。
>=
- 含义:大于等于
- 示例:如${__jexl3(${count}>=15,)}。也就是${count}>=15,其判断为真,那么执行IF控制器下的子项。
注意:
如果判断表达式是字符串,此时,必须要用引号,变量都认为时字符串的形式,如:${__jexl3("${name}"=="成都",)},不能用${__jexl3(${name}=="成都",)}
Linux上使用
1、安装JDK8并配置环境变量。
2、下载安装包。
3、在 /usr/local 目录下创建 jmx、jtl、test-report 文件夹用于存放压测脚本、记录结果文件和测试报告
mkdir {jmx,jtl,test-report}
4、在Linux服务器上以非GUI界面去执行JMX压测脚本
官方参数地址:
http://jmeter.apache.org/usermanual/get-started.html
非GUI界面,压测参数讲解:
-n 非GUI模式
-t 指定要运行的 JMeter 测试脚本文件
-l 记录结果的文件(要确保之前没有运行过,即xxx.jtl不存在,不然报错)
-e 在脚本运行结束后生成html报告
-o 用于存放html报告的目录(目录要为空,不然报错)
cd /usr/local/jmeter-5.5/bin
./jmeter -n -t /usr/local/jmx/users.jmx -l /usr/local/jtl/result.jtl -e -o /usr/local/test-report
5、下载并查看压测报告
打开jmeter,新建线程组 -> Listener -> Summary Report ->浏览jtl文件
6、压测减少资源使用的一些优化建议,使压测结果更准确
a、使用非GUI模式。
b、用内网压测,减少带宽影响压测结果。
c、尽可能少地使用断言,因为大量判断或者正则匹配会影响结果。
d、在本地测试阶段如果使用了Listener的一些报告等,则在正式测试时必须使用-l参数,它可以删除或禁用Listener。
e、如果压测大流量,尽量多几个节点以非GUI模式向服务器施压。
7、分布式压测
114作为主节点,115作为slave节点,压测修改master节点信息:
jemeter.properties 值是slave机器的ip+端口号,如果有多个,用逗号分隔
remote_hosts=10.0.0.115:1099
server.rmi.ssl.disable=true
修改slave节点信息:
server.rmi.ssl.disable=true
注意:master机器启动后会拷贝jmx文件到slave机器,所以不需要在每台slave机器上也上传一份jmx,只需要在master机器上上传一份jmx脚本即可。如果使用csv进行参数化,则需要把参数文件在每台slave上拷一份且路径需要设置成一样的。
先启动slave机器,注意要同个网段,ip地址用内网ip
cd /usr/local/jmeter-5.5/bin
nohup ./jmeter-server &
检查启动是否成功
ps -ef|grep jmeter-server
主节点上执行测试命令(注意远程压测多了 -r 参数):
./jmeter -n -t /usr/local/jmx/users.jmx -r -l /usr/local/jtl/result.jtl -e -o /usr/local/test-report
问题总结
1、Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 1073741824 bytes for committing reserved memory.`
解决:
编辑jmeter
搜索 : "${HEAP:="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"}"
改变初始堆内存和最大堆内存。
2、Server failed to start: java.rmi.server.ExportException: Listen failed on port: 0; nested exception is:
java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)
An error occurred: Listen failed on port: 0; nested exception is:
java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)
解决:
拥有RMI over SSL的有效密钥库,或者禁用了SSL。
禁用SSL:
jmeter.property里面 server.rmi.ssl.disable 改为 true,表示禁用。