文章目录
版本记录
日期 | 人员 | 类型 | 版本 | 说明 |
---|---|---|---|---|
2019年12月22日 | dcmini | 创建 | v1.0.0 |
说明
在搭建JMeter 测试集群的过程中遇到了一些坑在这里做一些记录, 如果有什么问题欢迎大家在评论中指出。
存疑问题
序号 | 说明 | 是否解决 | 解决日期 |
---|---|---|---|
1 | 如何使用命令行参数或者环境变量来改变JVM的运行参数 | 否 | |
2 | JMeter server 启动时,在命令行中加上 server.rmi.ssl.disable 参数会失效,必须到jmeter.properties 文件中修改 | 否 | |
3 | 集群模式 server 读取 csv 文件是否有其他更好的方式,目前只能等分切分才能保证不重复读取 | 否 |
JMeter 简单说明
下载及安装
推荐去官网下载: https://jmeter.apache.org/download_jmeter.cgi
解压缩后就可以跑起来了。
ps:
- 我不喜欢在 环境变量里配置
JMETER_HOME
,因为测试机器一般是临时开的有的时候还是借用其他环境的机器用完之后还要删除,感觉很麻烦。
如何查看说明文档
打开 $JMETER_HOME/printable_docs/index.html
,这个和官方文档是一样的,离线看速度快一点儿。
$JMETER_HOME/bin
文件夹下文件的说明
jmeter
: linux 环境下的启动脚本jmeter-server
:linux 环境下 server 的启动脚本jmeter.bat
:windows 环境下的启动脚本jmeter-server.bat
:windows 环境下 server 的启动脚本
这里需要注意的是 jmeter-server*
文件调用的还是 对应的 jmeter
文件,所以我们需要多 jmeter-server
进行的配置都需要在 jmeter
文件中找答案。
如何调整 JMeter 的JVM配置
因为 JMeter 是用 JAVA 编写的,所以其启动方法肯定就是运行 java -jar
这条命令,所以几乎所有的配置都是挂在这条命令之下的。我们可以看一下启动文件中都挂了哪些参数。
以 $JMETER_HOME/bin/jmeter
文件为例,在其最后一行前加上 echo
命令。
然后我们启动 JMeter 就可以看到其拼写出来的 java -jar
命令
/Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home/bin/java -server -XX:+HeapDumpOnOutOfMemoryError -Xms2g -Xmx2g -XX:MaxMetaspaceSize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1ReservePercent=20 -Djava.security.egd=file:/dev/urandom -Duser.language=en -Duser.region=EN -Xdock:name=JMeter -Xdock:icon="./../docs/images/jmeter_square.png" -Dapple.laf.useScreenMenuBar=true -Dapple.eawt.quitStrategy=CLOSE_ALL_WINDOWS -jar ./ApacheJMeter.jar
我们来理一下这些参数
-server
JMeter单机启动也是启动一个 server ,地址是默认的127.0.0.1
-XX:+HeapDumpOnOutOfMemoryError
当内存溢出的时候储存heap dump
文件,文件可以使用 JAVA 的jhat
命令生成网页报告,也可以使用 Eclipse Memory Analyzer(MAT) 来生成报告。-Xms2g
JVM 初始分配的内存-Xmx2g
JVM 最大分配的内存-XX:MaxMetaspaceSize
Meta区最大-XX:+UseG1GC
启动 G1 回收器-XX:MaxGCPauseMillis
设置每次年轻代垃圾回收的最长时间-XX:G1ReservePercent
设置堆内存保留为假天花板的总量-Djava.security.egd
JAVA 用于加快可靠算技术的产生-Duser.language
用户语言-Duser.region
用户区域-Xdock:name
dock 名字-Xdock:icon
dock 图标-Dapple.laf.useScreenMenuBar
不知道是啥意思😿-Dapple.eawt.quitStrategy
不知道是啥意思😢
我们打开 $JMETER_HOME/bin/jmeter
可以看到这些参数都是写在这份文件中的。
那么这里就有一个疑问了我们可以通过哪些方式来修改 JVM 的参数呢?
- 修改
$JMETER_HOME/bin/jmeter
文件 - 命令行参数
- 环境变量
测试发现只能修改$JMETER_HOME/bin/jmeter
文件能够修改。
这里我不是很理解为什么 JMeter 不设计然我们用命令行或者环境变量来修改JVM参数,可能是我没有找到,如果大家有知道的话请留言告诉我
集群说明
JMeter 的集群模式是主从结构,主控节点负责分发执行脚本,被控节点用于执行分发下来的脚本。
启动 被控节点 的 JMeter server
$ ./jmeter-server \
-J server_port=40005 \
-J server.rmi.localport=40005 \
-J server.rmi.ssl.disable=true \
-D java.rmi.server.hostname=192.168.0.3
当然大家也可以使用 nohup ... &
到后台运行
参数说明
server_port
服务监听端口server.rmi.localport
rmi 监听端口server.rmi.ssl.disable
rmi ssl 关闭java.rmi.server.hostname
rmi hostname 在多网卡的时候必须配置
在这里还是有一个问题,那就是有的时候 server.rmi.ssl.disable
这个配置好像是不生效的,需要到 jmeter.properties 文件中 将 server.rmi.ssl.disable
改成 =true
才可以。
主控节点 分发任务
这里可以使用GUI界面进行任务的下发, 也可以使用no-GUI模式下发,我还是喜欢后者,但是我没有比较过这两者在性能上有多大的差距,大家如果知道的话请告诉我。
$ ./jmeter \
-R 192.168.2.243:40005 \
-D java.rmi.server.hostname=192.168.1.78 \
-n -t '/root/car_share_jmeter/jmx/MQTT-No1-01.jmx' \
-l '/root/car_share_jmeter/result/MQTT-No1-00001-10000-1000-1-2019年12月20日首次.csv' \
-G thread_numOfThreads=10000 \
-G thread_rampUpPeriod=1000 \
-G lp_pubMessage=7 \
-G csv_deviceInfo='/root/car_share_jmeter/csv/10000/MQTT_TEST_01_10000.csv' \
-G ct_pubMessage=570000
这里就算变贴一个以前项目的测试命令,参数说明
-R
远程 server 的地址,多个 server 用,
隔开-D
rmi 的 hostname 多网卡的时候需要配置-n
使用非GUI 模式启动-t
测试脚本文件路径-l
结果文件地址,这里也是有一个问题,那就是这个文件的目录必须事先创建好,感觉非常不方便。-G
测试脚本的一些自定义参数,这里发现-J
在集群模式下是不起作用的
主控节点 中途停止
以前我每一次要中途停止测试都是 ctrl + c
强制停止线程,后来发现这个方法好蠢。在 $JMETER_HOME/bin
目录下随便找一下就有 stoptest.sh
脚本,看名字就是用来中途停止测试的。
在主控节点上运行 ./stoptest.sh
就可以停止测试。
集群测试 CSV 文件的处理
很多时候我们需要让 JMeter 从 csv 文件中读取模拟用户的用户名和密码来模拟多用户登陆的场景,在单机模式时只要填写上文件路径就可以了,但是在集群模式下 各个 server 是不知道对方的存在的,所以需要我们自己来避免集群中的多个线程读取到同一条csv 文件记录。
我使用的方法是将csv文件按照 server 数量均匀拆分 并保存到 被控节点的相同目录下。
如果大家有更好的办法请告诉我。