JMeter学习笔记
JMeter学习笔记
第一章 JMeter安装及基础
1、本地快速安装Jmeter
1、需要安装JDK8。或者JDK9,JDK10
2、下载地址
windows:
http://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-4.0.zip
mac或者linux:
http://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-4.0.tgz
3、文档地址
http://jmeter.apache.org/usermanual/get-started.html
4、建议安装JDK环境,虽然JRE也可以,但是压测https需要JDK里面的 keytool工具
2、常用压力测试工具对比
1、loadrunner:性能稳定,压测结果及细粒度大,可以自定义脚本进行压测,但是太过于重大,功能比较繁多
2、apache ab(单接口压测最方便): 模拟多线程并发请求,ab命令对发出负载的计算机要求很低,既不会占用很多CPU,也不会占用太多的内存,但却会给目标服务器造成巨大的负载, 简单DDOS攻击等
3、webbench:webbench首先fork出多个子进程,每个子进程都循环做web访问测试。子进程把访问的结果通过pipe告诉父进程,父进程做最终的统计结果。
3、Jmeter目录文件讲解
1、bin:核心可执行文件,包含配置
jmeter.bat:: Windows启动文件
jmeter:Mac或者linux启动文件
jmeter-server:Mac或者Liunx分布式压测使用的启动文件
jmeter-server.bat::Windows分布式压测使用的启动文件
jmeter.properties::心配置文件
2、extras:插件拓展的包
3、lib:心的依赖包
4、ext:核心包
5、junit:单元测试包
4、Jmeter切换为中文样式
1、控制台修改(临时性显示为中文,下次在打开Jmeter还是默认显示问英文):菜单栏 -> options -> choose language -> Chinese(Simplified)
2、配置文件修改(永久性显示问中文样式):Jmeter的安装目录-> bin目录 -> jmeter.properties文件-> 使用记事本打开-> #language=en修改为language=zh_CN
第二章 JMeter核心组件讲解
1、线程组
线程数:模拟用户并发数(虚拟用户数)。一个虚拟用户占用一个进程或线程。
Ramp-Up时间(秒):设置的虚拟用户数需要多长时间全部启动。如果线程数为20 ,准备时长为10 ,那么需要10秒钟启动20个线程。也就是每秒钟启动2个线程。
循环次数:每个线程发送请求的次数。如果线程数为20 ,循环次数为100 ,那么每个线程发送100次请求。总请求数为20*100=2000 。如果勾选了“永远”,那么所有线程会一直发送请求,一到选择停止运行脚本。
2、HTTP请求
web服务器:
默认协议:http
默认端口:80
服务器名称或IP :请求的目标服务器名称或IP地址
路径:服务器URL
Use multipart/from-data:当发送POST请求时,使用Use multipart/from-data方法发送,默认不选中。(如服务器支持,不进行勾选也可以)
4、断言
apply to:指定断言作用范围。关于应用范围,我们大多数勾选“main sample only” 就足够了,因为我们一个请求,实质上只有一个请求。但是当我们发一个请求时,可以触发多个服务器请求,就有main sample 和 sub-sample之分了。
Main sample and sub-samples:匹配范围包括当前父取样器并覆盖至子取样器
Main sampie only:匹配范围是当前父取样器
Sub-samples only:仅匹配子取样器
JMeter Variable Name to use:支持对JMeter变量值进行匹配
测试字段:针对响应数据的不同部分进行匹配
①响应文本:响应服务器返回的文本内容
②响应代码:匹配响应代码,比如返回代码“200”表示成功
③响应信息:匹配响应信息,比如处理成功返回“成功”字样
④响应头:匹配响应中的头信息
⑤请求头:请求中的头信息
⑥URL样本:匹配URL链接
⑦文档(文本):对文档内容进行匹配
⑧忽略状态:当第一个断言失败时可以忽略
⑨请求数据:请求数据
模式匹配规则:
①包括:响应内容包括需要匹配的内容即代表响应成功
②匹配:响应内容要完全匹配需要匹配的内容即代表响应成功,不区分大小写,支持正则
③相等:响应内容要完全等于需要匹配的内容才代表响应成功,区分大小写,匹配内容是字符串非正则表达式
④字符串:响应内容包含需要匹配的内容才代表响应成功,区分大小写,匹配内容是字符串非正则表达式
⑤否:反转检查结果,用于表示不包含,不匹配,不等于,没有和模式字符串相匹配的字符串。若匹配成功则返回失败
⑥或者: 一个断言可以添加多个“要测试的模式”。使用OR选项后,只要其中有1个模式匹配,断言将会成功。不选择“OR”时将默认为AND选项,必须所有模式都匹配,断言才会成功。
测试模式:输入结果期望值(空格要去掉)。这里填写我们要进行断言的内容,可以添加多个模式,可以使用变量、文本、正则表达式(在“包括”和“匹配”模式下)。
JSON断言:书写格式为 $.msg
$表示根 也就是{
.表示子 也就是{下的元素
{
“msg”:成功,
“state”:b,
“data”:[
{
“name”:“测试”,
“age”:“12”,
}
]
}
注释:需要勾选上Additionally assert value,并填写上需要断言的内容,否则只检测是否有msg这个属性,有就返回ture,不会对内容做判断
若需要获取content,则修改为$.content (获取所有content)
若需要获取A的所有子类,则修改为$…A(获取所有的所有子类)
若只需要获取A的第二个子类,则修改为$…A[1],
当然也可以这样写:$.content.data.allCitySearchLabels.A[1].id,这样便能获取所有A类第二个的ID
XPath断言:书写格式为 //a[@name =“tj_trnews”]
其中,//表示相对路径,a表示标签,[]里面放谓词,@name="tj_trnews"表示属性,多个属性用 and、or表示。如果查看结果树使用XPath Tester显示时,记得勾选上return entire XPath fragment instead of text content,否则结果会显示失败
断言结果监听器: 线程组-> 添加 -> 监听器 -> 断言结果
里面的内容是sampler采样器的名称
断言失败,查看结果树任务结果颜色标红(通过结果数里面双击不通过的记录,可以看到错误信息)
5、添加监听器
察看结果树:线程组->添加->监听器->察看结果树(比较常用,也可根据需求添加不同监听器)
6、聚合报告
新增聚合报告:线程组->添加->监听器->聚合报告(Aggregate Report)
lable: sampler的名称
Samples: 一共发出去多少请求,例如10个用户,循环10次,则是 100
Average: 平均响应时间
Median: 中位数,也就是 50% 用户的响应时间
90% Line : 90% 用户的响应不会超过该时间 (90% of the samples took no more than this time. The remaining samples at least as long as this)
95% Line : 95% 用户的响应不会超过该时间
99% Line : 99% 用户的响应不会超过该时间
min : 最小响应时间
max : 最大响应时间
Error%: 错误的请求的数量/请求的总数
Throughput: 吞吐量——默认情况下表示每秒完成的请求数(Request per Second) 可类比为qps
KB/Sec: 每秒接收数据量
第三章 自定义变量和CSV可变参数压测
1、用户自定义变量
很多变量在全局中都有使用,或者测试数据更改,可以在一处定义,四处使用,引用格式为${xxx}”
添加路径:线程组->add -> Config Element(配置原件)-> User Definde Variable(用户定义的变量)
2、CSV可变参数压测
添加路径:线程组->add -> Config Element(配置原件)-> CSV data set config (CSV数据文件设置)
引用csv格式文件:上传CSV格式文件、设置变量名称、设置线程共享模式(一般默认选择“所有现场”)
引用txt格式文件:上传txt格式文件、设置变量名称、多个参数时设置分隔符号(逗号、竖线等都可以)、设置线程共享模式(一般默认选择“所有现场”)
3、CSV文件多参数使用
多参使用:添加多个变量名称(多个变量名称之间用英文的逗号分隔)、设置分隔符号
第四章 MySQL数据库压测实操
1、JDBC request压测Mysql讲解
添加JDBC Request:
添加JDBC Connection Configuration配置:常用配置说明
添加jar包文件:
注释:variable name of pool declared in JDBC Connection Configuration(在JDBC连接配置中声明的池的变量名)与variable name for created pool(创建池的变量名)填写应一致
2、JDBC request压测Mysql
添加JDBC Request:
第五章 分布式压测基础知识
1、分布式压测介绍
普通压测:单台机可以对目标机器产生的压力比较小,受限因素包括CPU,网络,IO等
分布式压测:利用多台机器向目标机器产生压力,模拟几万用户并发访问
2、Jmeter分布式压测原理
原理:①总控机器的节点master,其他产生压力的机器叫“肉鸡” server
②master会把压测脚本发送到 server上面
③执行的时候,server上只需要把jmeter-server打开就可以了,不用启动jmeter
④结束后,server会把压测数据回传给master,然后master汇总输出报告
⑤配置详情
控制机:运行多台jmeter负载机进行性能测试时,被选中作为管理机的那台机器就是控制机。控制机也可以参与脚本的运行,同时它也担负管理远程负载机指挥远程负载机运行工作,且收集远程负载机运行测试结果。
负载机: 负载机就是向被测应用服务发起负载(请求)的机器。控制机同时也是一台负载机。jmeter负载机受控制机(jmeter负载机)的管理。与支持其他远程运行的测试工具一样,负载机受控制机管理首先要启动一个客户端程序(Agent:jmeter-server.bat),这样控制机才可以接管负载机。控制机会把运行的脚本隐蔽的发送到远程负载机,但是运行的测试脚本有参数文件或者依赖jar包时,控制机并不能把他们发送到远程负载机,这种情况就需要手动拷贝,也可以用工具实现自动拷贝
远程运行逻辑:远程负载机首先启动agent程序,待控制机连接;控制机连接上远程负载机;控制机发送指令(脚本及启动命令)启动线程;负载机运行脚本,回传状态(包括测试结果);控制机收集结果并显示。
第六章 Linux服务器压测接口实战
3、Linux服务器下安装启动JDK并配置环境变量
JDK下载地址:
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
选择Linux x64进行下载
远程传输文件工具:mac系统FileZilla
windows系统securecrt
①使用FileZilla上传JDK包(存在位置自行选择)
②远程连接服务器进入相应目录,并使用tar -zxvf命令解压JDK包
③解压完成后使用mv命令重名称文件夹
④先进入jdk的bin目录下使用(命令:vim /etc/profile)(虚拟机:vi /etc/profile)进入全局变量中设置环境变量
⑤输入“i”进入输入模式并配置变量(保存命令离开:wq)
export JAVA_HOME=/usr/local/jdk1602
export PATH=$PATH:JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH
⑥输入(source /etc/profile)命令使配置生效
虚拟机centos7 配置文件输入以下内容
⑦输入java及 java -version检测版本及是否生效
4、守护进程及ECS服务器防火墙设置
守护进程开启:nohup java -jar xxxxx &
centOS7开启防火墙:systemctl start firewalld.service
centOS7关闭防火墙:systemctl stop firewalld.service
centOS7查看防火墙运行状态:firewall-cmd --state
5、Linux服务器安装Jmeter
wget+下载jmeter地址进行下载:
tar -zxvf 命令进行解压:
6、Jmeter非GUI界面参数讲解
压测参数:-h 帮助
-n 非GUI模式
-t 指定要运行的 JMeter 测试脚本文件
-l 记录结果的文件 每次运行之前,(要确保之前没有运行过,即xxx.jtl不存在,不然报错)
-r Jmter.properties文件中指定的所有远程服务器
-e 在脚本运行结束后生成html报告
-o 用于存放html报告的目录(目录要为空,不然报错)
官方配置文件地址 :http://jmeter.apache.org/usermanual/get-started.html
7、Linux服务器下非GUI执行Jmeter
给测试脚本最大权限:chmod 777 测试脚本名称
进行压测:进入jmeter的bin目录下输入以下命令
./jmeter -n -t /usr/local/jmeter/temp/40人线程组.jmx -l /usr/local/jmeter/temp/jtl/result.jtl
修改jmx文件内网地址及删除jtl文件
创建目录文件夹
第七章 压测HTML可视化压测报告
1、测试报告jtl文件查看
查看jtl文件:利用FileZilla工具下载jtl文件,jmeter图形界面添加“汇总报告(Summary Report)”进行预览查看
2、Jmeter压测接口的性能优化
减少资源使用: 1、使用非GUI模式:jmeter -n -t test.jmx -l result.jtl
2、少使用监听器(Listener), 如果使用-l参数,它们都可以被删除或禁用。
3、在加载测试期间不要使用“查看结果树”或“查看结果”表监听器,只能在脚本阶段使用它们来调试脚本。
4、包含控制器在这里没有帮助,因为它将文件中的所有测试元素添加到测试计划中。]
5、不要使用功能模式,使用CSV输出而不是XML
6、只保存你需要的数据,尽可能少地使用断言
7、如果测试需要大量数据,可以提前准备好测试数据放到数据文件中,以CSV Read方式读取。
8、用内网压测,减少其他带宽影响压测结果
9、如果压测大流量,尽量用多几个节点以非GUI模式向服务器施压
3、压测生成HTML测试报告
进入jmeter的bin目录执行命令并生成html报告
./jmeter -n -t /usr/local/jmeter/temp/40人线程组.jmx -l /usr/local/jmeter/temp/jtl1/result1.jtl -e -o /usr/local/jmeter/temp/result
4、HTML压测报告dashdoard参数
参数详解:
1)Test and Report informations(测试和报告信息)
Source file:jtl文件名
Start Time :j压测开始时间
End Time :j压测结束时间
Filter for display:j过滤器
Lable:sampler采样器名称
2)APDEX(Application performance Index)(APDEX(应用程序性能指数))
apdex:应用程序性能指标,范围在0~1之间,1表示达到所有用户均满意
T(Toleration threshold):可接受阀值
F(Frustration threshold):失败阀值
3)Requests Summary(请求摘要)
OK:成功率
KO:失败率
4)Statistics( 统计数据)
lable:sampler采样器名称
samples:请求总数,并发数*循环次数
KO:失败次数
Error%:失败率
Average:平均响应时间
Min:最小响应时间
Max:最大响应时间
90th pct: 90%的用户响应时间不会超过这个值(关注这个就可以了)
95th pct: 95%的用户响应时间不会超过这个值
99th pct: 99%的用户响应时间不会超过这个值 (存在极端值)
throughtput:Request per Second吞吐量 qps
received:每秒从服务器接收的数据量
send:每秒发送的数据量
5、HTML压测报告Charts报表参数
参数详解:
1)Over Time(随着时间的变化)
Response Times Over Time:响应时间变化趋势
Response Time Percentiles Over Time (successful responses):最大,最小,平均,用户响应时间分布
Active Threads Over Time:并发用户数趋势
Bytes Throughput Over Time:每秒接收和请求字节数变化,蓝色表示发送,黄色表示接受
Latencies Over Time:平均响应延时趋势
Connect Time Over Time :连接耗时趋势
2)Throughput(吞吐量)
Hits Per Second (excluding embedded resources):每秒点击次数
Codes Per Second (excluding embedded resources):每秒状态码数量
Transactions Per Second:即TPS,每秒事务数
Response Time Vs Request:响应时间和请求数对比
Latency Vs Request:延迟时间和请求数对比
3)Response Times(响应时间)
Response Time Percentiles:响应时间百分比
Response Time Overview:响应时间概述
Time Vs Threads:活跃线程数和响应时间
Response Time Distribution:响应时间分布图
第八章 多节点Jmeter分布式压测实战
1、Jmeter分布式压测准备工作
注意事项:1、系统上的防火墙被关闭或正确的端口被打开
2、所有的客户端都在同一个子网上
3、如果使用192.x.x.x或10.x.x.x IP地址,则服务器位于同一子网中。 如果服务器不使用192.xx或10.xx IP地址,则不应该有任何问题。
4、确保JMeter可以访问服务器
5、确保在所有系统上使用相同版本的JMeter和Java。 混合版本将无法正常工作
6、您已为RMI设置SSL或将其禁用
7、一定要用内网IP,不用用公网IP,用ping去检查
专业名字:master:司令
slave:奴隶
target:目标
远程拷贝(内网地址):
scp -r /usr/local/software/jdk-8u141-linux-x64.tar.gz root@172.18.230.233:/usr/local/software
scp -r /usr/local/software/jmeter/apache-jmeter-4.0.tgz root@172.18.230.233:/usr/local/software/jmeter
启动jmeter命令:./jmeter-server 或者 nohup ./jmeter-server &(守护进程方式,不推荐,无法查看到压测效果)
使用守护进程启动jmeter时,需要进行检测启动是否成功
ps -ef|grep jmeter-server
ps aux|grep jmeter-server
图示:
2、Jmeter实战
1、修改master节点信息:修改jmeter.properties文件
jemeter.properties 值是slave机器的ip+端口号,如果有多个,用逗号分隔
remote_hosts=192.168.0.102:8899,192.168.0.101:8899
server.rmi.ssl.disable=true
2、修改slave节点信息:修改jmeter.properties文件
server_port=1099
server.rmi.ssl.disable=true
3、启动slave机器,注意要同个网段,ip地址用内网ip:出现以下内容证明启动成功
3、实战压测环境配置
需注意要将防火墙关闭
1、设置slave机器jmeter.properties文件中的ip地址及端口(ip为主机master的内网ip地址),同时修改server.rmi.ssl.disable为true
2、启动slave机器的jmeter.server.bat
3、设置主机jmeter.properties文件中的ip地址及端口(ip为从机slave的内网ip地址),同时修改server.rmi.ssl.disable为true
4、启动主机master的jmeter.server.bat
5、启动主机jmeter.bat并打开测试计划
6、选择单个执行远程压测或全部启动
4、非GUI执行压测
进入jmeter的bin目录下,在地址栏输入cmd启动,执行下方命令(测试计划地址换成自己的)
jmeter -n -t /E:\ceshi/40ceshi.jmx -r -l /E:\ceshi/jtl/result.jtl -e -o /E:\ceshi/resultlt
5、Jmeter压测常见问题处理及注意事项
问题1:
[root@iZwz95j86y235aroi85ht0Z bin]# ./jmeter-server
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[:39308](local),objID:[24e78a63:16243c70661:-7fff, 7492480871343944173]]]
Server failed to start: java.rmi.RemoteException: Cannot start. Unable to get local host IP address.; nested exception is:
java.net.UnknownHostException: iZwz95j86y235aroi85ht0Z: iZwz95j86y235aroi85ht0Z: Name or service not known
An error occurred: Cannot start. Unable to get local host IP address.; nested exception is:
java.net.UnknownHostException: iZwz95j86y235aroi85ht0Z: iZwz95j86y235aroi85ht0Z: Name or service not known
解决办法:
hostname 命令获取机器名称,追加一个映射 iZwz95j86y235aroi85ht0Z
vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
120.79.160.143 iZwz95j86y235aroi85ht0Z
windows用户 修改c:\windows\system32\drivers\etc\hosts文件,增加一条域名 与IP的映射
问题2:
[root@iZwz95j86y235aroi85ht0Z bin]# ./jmeter-server
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)
解决办法:修改jmeter.properties文件
拥有RMI over SSL的有效密钥库,或者禁用了SSL。
1、禁用SSL
jmeter.property里面 server.rmi.ssl.disable 改为 true,表示禁用
问题3:
[root@iZ949uw2xehZ bin]# ./jmeter
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.
# An error report file with more information is saved as:
# /usr/local/jmeter/apache-jmeter-4.0/bin/hs_err_pid5855.log
解决办法:修改jmeter.properties文件
编辑jmeter
搜索 : "${HEAP:="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"}"
改变初始堆内存和最大堆内存
问题4:
"could not find ApacheJmeter_core.jar"
解决办法:
在Agent机器安装jdk,并设置环境变量
问题5:
”Bad call to remote host"
解决办法:
检查被控制机器上的jmeter-server有没有启动,或者remote_hosts的配置是否正确。
问题6:
连接失败原因排查
解决办法:
1. jmeter-server是否启动;
2. 是否联网
3. ping 服务器IP是否畅通.
4. telnet 端口 192.168.3.10 1099
5. 检查服务器的防火墙是否关闭。
6. 阿里云安全策略是否正常
问题7:
<!-- jmeter 分布式性能测试(多网卡配置) -->
解决办法:
在多网卡的服务器上开启RMI服务的话必须指定IP,使他们能够在同一个网段内。
需要以下几步(假定所有机器都在10.120.11.*网段,agent服务器为linux,controller服务器为windows):
1、 修改agent服务器,指定agent机器的IP
修改jmeter-server文件
# vi jmeter-server
修改RMI_HOST_DEF=-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx(需要连接的IP)
2、修改server服务器,指定server机器的IP
修改jmeter.bat文件
新增set rmi_host=-Djava.rmi.server.hostname=10.120.11.214
修改set ARGS=%DUMP% %HEAP% %NEW% %SURVIVOR% %TENURING% %PERM% %DDRAW% %rmi_host%
注意事项:
1、仅修改 server_port 即可,下面两者一样
server.rmi.localport=8899 表示slave server启动显示的端口
server_port=8899 表示master机器要远程连接的端口 即 remote_hosts=xxxx:8899
2、确定在controller机器上安装jdk,版本和jmeter一致,配置环境变量:Java_home等
在Agent机器上安装jdk,配置环境变量:Java_home和JMeter_home
安装目录不要带空格,最好都是简短的英文路径
3、master机器启动后会拷贝jmx文件到slave机器,所以不需要在每台slave机器上也上传一份jmx,只需要在master机器上上传一份jmx脚本即可。
如果使用csv进行参数化,则需要把参数文件在每台slave上拷一份且路径需要设置成一样的。
总样本数 = 线程数 * 循环次数 * 执行机总数
4、问题解决相关博客地址:
https://www.cnblogs.com/Fine-Chan/p/6233823.html
https://blog.csdn.net/liujingqiu/article/details/52635289
https://www.cnblogs.com/puresoul/p/4844539.html
更多推荐
所有评论(0)