
Jmeter使用记录1
--分布式压测部署
背景
今天测试工作中需要对一个接口进行压测,很简单的任务。
但是测试结果不理想,这个接口的TPS一直卡在100以下,达不到要求。
根据聚合报告,send的速率一直很低,一般只有20kb/s,开发怀疑是网络问题导致的,但是我这边经过尝试,调用简单接口时,速率是可以很高的。
想排除网络问题,尝试了下面几个办法:
多次执行脚本
-- 每次的结果稳定在97左右,说明不了问题本地电脑执行
-- 自己用的是云桌面,怀疑是用户量大相互抢资源导致网络慢。切换到同事的本地电脑上执行,TPS到140,的确比云桌面强,但是也不达标。分布式压测 -- 先是用自己的云桌面当做master节点,发现salve节点的数据一直同步不过来,查看日志发现应该是云桌面做了安全策略,导致salve节点连不到master。最终使用第三台服务器作为master,使用non-gui命令完成压测。本文主要就是记录下这个过程中的过程和遇到的一些坑及解决办法。
--其实200个并发的基础压测压根用不上这种方式,并发量起不来的根因,一个是服务本身处理逻辑太多,另一个就是网络限制,发送速率一直很低。
执行原理
Master节点将测试脚本同步到所有Slave节点,Slave节点拿到脚本后开始同步开始执行 Slave节点执行完成后,将结果反传回Master节点,Master节点Jmeter服务解析结果并展示

部署步骤
以上图中的三个节点为例,即Master(192.168.0.2), 两个Salve(192.168.0.10, 192.168.0.15)
准备工作:
至少两台服务器。
-- 内网环境的话两台机器需要能相互ping通jmeter安装包,版本要相同。
--机器处于外网环境可以直接使用wget下载,地址如下:wget http://archive.apache.org/dist/jmeter/binaries/apache-jmeter-5.4.zip
--内网的话可以在官网下好后传入,地址同上。外网环境下的机器要保障带宽。
-- 压力测试瓶颈大多都在带宽上,需要保证压力机带宽要比服务器的带宽高,不然压力上不去需要所有jmeter都设置好ssl for rmi
--jmeter4.0以后版本需要如果脚本配置的有读取外部参数化文件(csv),需要将文件上传每个执行机(slave)上
Slave节点的配置
Ⅰ. 环境准备
这一步主要是配置Slave节点环境,主要是Java JDK和Jmeter的安装,要保证所有Slave节点版本一致。
Java安装可自行度娘教程,不再赘述。
Jmeter安装:
这里记录Linux系统的安装步骤:
a. 将下载的Jmeter安装包上传到所有节点,可以使用Xftp,也可以使用scp,方式不限。
b. unzip解压安装包
c. 将jmeter添加到环境变量,命令如下
1.编辑profile文件
vim /etc/profile
2.增加环境变量:
export JMETER_HOME=/usr/local/jmeter/apache-jmeter-5.4(jmeter安装路径)
export CLASSPATH=JMETER_HOME/lib/jorphan.jar:CLASSPATH
export PATH=PATH:$HOME/bin
3.使修改生效
source /etc/profile
4.验证
jmeter -v
Ⅱ. 修改jmeter.properties配置
1.文件路径:xxx/apache-jmeter-5.4.1/bin
2.解开remote_port、server.rmi.localport、server.rmi.port注释,开放端口,默认为1099。
使用netstat -anp |grep 1099找出占用进程,若是有用的进行,就修改端口,三个值需要相同;若是无用进程,kill -9 PID结束进程,释放端口。

3.解开server.rmi.ssl.disable,将值改为true。
--这里改为true就是直接禁用RMI。不改的话会有一个文件不存在的异常。
"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)
--这里报错的根本原因是,jmeter 4.0版本之后需要手动生成秘钥。执行./create-rmi-keystore.sh,按提示操作后生成rmi_keystore.jks,将生成的文件拷贝到所有Slave节点的bin目录下即可。
Ⅲ. 修改jmeter-server
1.文件路径:xxx/apache-jmeter-5.4.1/bin
2.解开RMI_HOST_DEF=-Djava.rmi.server.hostname={slave IP},Slave IP替换为节点IP
--这一步是为了直接使用jmeter-server启动,不修改的话可以直接使用如下命令启动服务。
./jmeter-server Djava.rmi.server.hostname={slave IP},Slave IP替换为节点IP。
Master节点的配置
Ⅰ. 环境准备
这一步主要是配置Master节点环境,也需要Java JDK和Jmeter,安装步骤同上。
网络互通的情况下,Master节点一般使用Windows,有UI可以直观的进行操作。相关的配置修改其实都差不多,这里还是只记录Linux系统下的相关操作。
Ⅱ. 修改jmeter.properties配置
1.文件路径:xxx/apache-jmeter-5.4.1/bin
2.修改remote_hosts=localhost:1099,192.168.0.10:1099,192.168.0.15:1099
--这里localhost也可以是127.0.0.1或者自身节点IP:192.168.0.2,这样配置时,当启动所有远程脚本时,Master节点自身也是一台执行机,也会执行脚本并返回结果
3.解开remote_port、server.rmi.localport、server.rmi.port注释,开放端口,默认为1099。
4.解开server.rmi.ssl.disable,将值改为true。
Ⅲ. 修改jmeter-server
1.文件路径:xxx/apache-jmeter-5.4.1/bin
2.解开RMI_HOST_DEF=-Djava.rmi.server.hostname={slave IP},Slave IP替换为节点IP
--这一步是为了直接使用jmeter-server启动,不修改的话可以直接使用如下命令启动服务。
./jmeter-server Djava.rmi.server.hostname={slave IP},Slave IP替换为节点IP。
如上配置基本跟Slave配置相同,主要是将Master也配置成执行机。
分布式执行
Ⅰ. 启动所有Slave节点jmeter-server xxx/apache-jmeter-5.4.1/bin目录下执行 ./jmeter-server
没有权限的话使用chmod 777 jmeter-server提权
Ⅱ. Master节点启动所有远程服务
Windows系统下启动按钮所在位置
这里还是主要记录下Linux下启动命令。
远程启动指定Slave节点
jmeter -n -t xxx.jmx -R 192.168.0.10,192.168.0.15 -l xxx.jtl -e -o xxx xxx.jmx为测试脚本,xxx.jtl为测试结果,xxx为测试报告文件夹(必须存在且不为空)远程启动所有Slave节点 jmeter -n -t xxx.jmx -r -l xxx.jtl -e -o xxx xxx.jmx为测试脚本,xxx.jtl为测试结果,xxx为测试报告文件夹(必须存在且不为空) Ⅲ. 等待所有Slave节点执行完成,将结果xxx.jht拷到Windows下,聚合报告选择浏览打开文件,就可以像UI模式下一样分析数据。 
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 指定测试报告生成文件夹(文件夹必须存在且为空文件夹)
踩坑
Windows Master远程启动所有,发现Slave节点有在执行,但是Master节点没有任何结果更新。查询Slave节点bin目录下的jmeter-server.log, 发现Slave到Master节点是不通的,所以结果回传不回去。这里就是前面步骤第一条,Master节点要跟Slave节点相互ping通。




