Jmeter 分布式部署
JMeter分布式执行原理
1、jmeter分布式压测时,选择其中一台作为调度机(master),其他机器做为执行机(slave)
2、执行时,调度机(master)会把脚本发送到没一台执行机(slave)上,执行机(slave)拿到脚本后就开始执行,执行机(slave)执行时不需要启动GUI,通过命令行模式执行。
3、执行完成后,执行机(slave)会把结果回传给调度机(master),调度机(master)会收集所有执行机(skave)的信息。
————————————————
JMeter 分布式执行逻辑
1、执行机机首先启动Agent程序(运行jmeter-server)
2、调度机连接上远程负载机(修改配置文件,会自动连接)
3、调度机发送指令(脚本及启动命令)启动线程(参数化文件或依赖包需要手动拷贝到每个执行机上)
————————————————
JMeter分布式部署步骤
前提条件:
1、关闭防火墙
2、所有客户端在同一个子网里
3、内网环境:服务端也和客户端在同一个子网里面
4、外网环境:压力测试瓶颈大多都在带宽上,需要保证压力机带宽要比服务器的带宽高,不然压力上不去
5、各个机器在相同的目录下安装相同版本的jmeter
6、需要所有jmeter都设置好ssl for rmi(jmeter4.0以后版本需要)
7、各个机器在相同目录下安装相同版本的JDK
8、如果脚本涉及读取外部参数化文件(csv),需要将文件上传每个执行机(slave)上
1.调度机(master)配置
修改jmeter.properties
在jmeter.properties文件中新增remote_host配置,配置是执行机(slave)主机的IP和端口号(默认端口为1099,可以修改)多个执行机以逗号,分割
————————————————
2.执行机(slave)配置
修改jmeter.properties配置
添加一行server.rmi.ssl.disable=true 保证远程连接通
开放三个默认端口(端口可随意修改只要未被占用即可)
server_port=1099
server.rmi.port=1099
server.rmi.localport=1099
修改jmeter-server
添加一行: RMI_HOST_DEF=-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx
————————————————
3.执行分布式
3.1先启动执行机(slave)远程服务
启动命令:./jmeter-server
(如果没执行权限就chomd 777 jmeter-server 命令赋权)
3.2控制机(master)执行
3.2.1Windows直接启动GUI界面执行
3.2.2linux 命令启动
1、jmeter -n -t baidu.jmx -R 192.168.66.100,192.168.66.101 -l baidu.jtl -e -o baidu
2、jmeter -n -t baidu.jmx -r -l baidu.jtl -e -o baidu(启动所有执行机salve)
jmeter命令行常用参数
-n 命令行模式
-t 指定jmx脚本地址(地址可以是相对路径,可以是绝对路径)
-h 查看帮助
-v 查看版本
-p 指定读取jmeter属性文件,比如jmeter.properties文件中设置的
-l 记录测试结果的文件,通常结果文件为jtl格式(文件可以是相对路径,可以是绝对路径)
-s 以服务器方式运行(也是远程方式,启动Agent)
-H 设置代理,一般填写代理IP
-P 设置代理端口
-u 代理账号
-a 代理口令
-J 定义jmeter属性,等同于在jmeter.properties中进行设置
-G 定义jmeter全局属性,等同于在Global.properties中进行设置,线程间可以共享)
-D 定义系统属性,等同于在system.properties中进行设置
-S 加载系统属性文件,可以通过此参数指定加载一个系统属性文件,此文件可以用户自己定义
-L 定义jmeter日志级别,如debug、info、error等
-j 制定执行日志路径。(参数为日志路径,不存在不会自动创建,将日志输出到命行控制台)
-r 开启远程负载机,远程机器列表在jmeter.properties中指定
-R 开启远程负载机,可以指定负载机IP,会覆盖jmeter.properties中remote_hosts的设置
-d 指定Jmeter Home目录
-X 停止远程执行
-g 指定测试结果文件路径,仅用于生成测试报表,参数是csv结果文件
-e 设置测试完成后生成测试报表
-o 指定测试报告生成文件夹(文件夹必须存在且为空文件夹)
————————————————
注意:
1.如脚本只含有参数化需将脚本中的绝对路径改为相对路径
2.需将参数化文件一同放置到执行机上
————————————————
问题详解:
问题一
[test@localhost bin]$ ./jmeter-server Writing log file to: /home/test/jmeter/apache-jmeter-3.1/bin/jmeter-server.log Created remote object: UnicastServerRef [liveRef: [endpoint:[127.0.0.1:37863](local),objID:[-3217392f:17b104e6552:-7fff, 742049333908920389]]] Server failed to start: java.rmi.RemoteException: Cannot start. localhost.localdomain is a loopback address. An error occurred: Cannot start. localhost.localdomain is a loopback address.
解决方法:执行命令中指定本地IP ./jmeter-server -Djava.rmi.server.hostname=xxx.xxx.xxx.xxx
问题二
[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
[root@iZwz95j86y235aroi85ht0Z bin]# vi /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:windowssystem32driversetchosts文件,增加一条域名与IP的映射
问题三
[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文件,将server.rmi.ssl.disable的值改为true
问题四
slave机器无法启动或者没有返回执行数据
解决方法:
1、检查master机器和slave机器能否ping通
2、检查防火墙
3、检查master机器和slave机器的服务器时间是否一致
问题五
jmeter分布式执行远程机报错,提示“Engine is busy – please try later”
解决办法1:
1.在停止jmeter测试的同时,使用master中的' Remote Stop all '选项,这会杀死远程机进程上正在运行的线程。
2.远程机的jmeter重新启动“jmeter-server,并重新开始测试。
解决方法2:一般用的比较少,这是在有wifi和物理网线同时有效的情况下用的。