jmeter为什么要做分布式压测
- 一台压力机的 Jmeter 支持的线程数受限于 Jmeter 其本身的机制和硬件配置(内存、CPU、IO等)是有限的
- 由于 Jmeter 是 Java 应用,对 CPU 和内存的消耗较大,在需要模拟大量并发用户数时,单机很容易出现 JAVA 内存溢出的错误,导致测试脚本本身就有瓶颈
Jmeter 支持分布式压测
- 将需要模拟的大量并发用户数分发到多台压力机,使 Jmeter 拥有更大的负载量,满足真实业务场景(高并发场景)
- 确保压力机不会出现性能瓶颈
- 在后面进行性能分析时,就不需要考虑压力机是否会导致性能瓶颈的主要原因之一
jmeter分布式原理
- Cnotroller 是控制机,Slaves 是多个压力机
- 分布式测试中,Cnotroller 通过命令行将测试脚本分发给所有 Slave
- Slave 不需要启动 Jmeter GUI,通过 CLI 模式执行测试
- Slave 执行完后,会把结果回传给 Master
- Master 收集所有 Slave 的结果并汇总成一个结果集
Slave压力机配置
- jmeter目录下的bin目录中,打开jmeter.properties文件,修改server.rmi.ssl.disable=false,改为true,并去掉注释
- jmeter目录下的bin目录中,打开system.properties文件,最后一行添加java.rmi.server.hostname=本机ip
Controller控制机配置
- jmeter目录下的bin目录中,打开jmeter.properties文件,修改server.rmi.ssl.disable=false,改为true,并去掉注释
- 打开Contorller机下jmeter安装文件下的bin目录:jmeter.properties文件,搜索remote_hosts=127.0.0.1,将Slave机的IP写在后面,多个ip用逗号隔开
执行分布式
- 先执行slave机, ./jmeter-server或jmeter-server.bat
- Controller机,执行./jmeter.sh或jmeter.bat
- 也可以命令启动
jmeter -n -t test.jmx -R 192.168.1.100,192.168.1.101 -l test.jtl
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 指定测试报告生成文件夹(文件夹必须存在且为空文件夹)
常见错误
- 报错 permission denied
解决办法:修改整个 jmeter 目录权限 Chmod -R 755 apache-jmete根目录 - connection refused
解决办法:
1.查看防火墙是否关闭
注:centos7 上关闭防火墙:
firewall-cmd --state //查看防火墙状态
systemctl stop firewalld.service //关闭防火墙
并重新启动 jmeter-server