Jmeter分布式集群搭建与使用
目录
一、JMeter 简介
核心功能
主要特点
二、JMeter插件扩展安装
三、JMeter分布式集群环境搭建
Jmeter分布式原理:
原理图:
主控机与负载机通信
测试执行流程
环境配置:
配置分布式测试环境
第一种测试机部署在不同的服务器上:
测试机配置:
主控机配置:
第二种测试机通过docker部署在同一台服务器上:
测试机配置:
主控机配置:
一、JMeter 简介
JMeter 是一款开源的性能测试工具,由 Apache 软件基金会开发和维护。最初设计用于测试 Web 应用程序的性能,后来扩展到支持多种协议和应用场景,包括数据库、FTP、SOAP、REST 等。
核心功能
-
性能测试:支持对 Web 应用、API、数据库等进行负载测试,模拟多用户并发场景。
-
分布式测试:支持多台机器协同运行测试,模拟更高并发。
主要特点
- 跨平台:基于 Java 开发,可在 Windows、Linux、macOS 等系统运行。
二、JMeter插件扩展安装
在真实企业压测场景中,我们通常为⼀点⼀点的逐步增加线程数,因此需要安装新的插件来⽀持线程数的配置。
通过插件管理⼯具下载其他插件:
https://jmeter-plugins.org/install/Install/
首先在这个官网中,下载插件管理工具,将其放置在 JMeter 的lib/ext录下,重启进入jmeter之后,就能看到右上角有一个蝴蝶标致,点开就可以安装想要的其他插件了。
1)下载其他监听器插件
2)下载线程组插件
点击ApplyChangesandRestartJMeter等待下载完成并重启JMeter.这个时候就可以看到新安装的插件。
三、JMeter分布式集群环境搭建
前言:本人在最开始使用jmeter进行性能压测的时候,选择Windos环境进行压测,因为Windos环境下有GUI图面,观测压测情况比较明显,操作也比较简易,但是存在一个弊端就是QPS上去之后,在高并发的场景下,单机压测会出现临时端口耗尽的问题,导致任务下发失败,此时就需要部署分布式集群环境来解决单机临时端口不足的问题。
Jmeter分布式原理:
JMeter分布式测试通过多台机器协同工作来模拟高并发负载,主控机(Master)负责下发测试计划和收集结果,而测试机(Slave)执行实际请求生成。
原理图:
主控机与负载机通信
- 主控机和测试机通过RMI(远程方法调用)协议通信,默认端口为1099。
- 主控机将测试计划分发到所有测试机,测试机接收后独立执行。
- 测试结果数据会实时或分批传回主控机进行聚合。
测试执行流程
- 主控机启动测试时,将.jmx文件序列化并发送到所有测试机。
- 每台测试机使用相同的测试计划,但根据分配的线程数生成独立负载,例如主控机启动了600个并发线程,如果有3台测试机,主控机可能会将600线程平均分配,每台测试机执行200线程。
- 测试机之间不直接通信,仅与主控机交互。
环境配置:
前言:本人使用最开始使用windos本地机器作为控制机,在一台Linux服务器上通过Docker搭建了三台测试机来搭建分布式集群,这里也可以把测试机搭建在不同的服务器上(本人偷个小懒,图方便就使用一台服务器了),但是由于公司网络防火墙的限制,本地不能访问远程服务器,最终就都在Linux环境下搭建分布式集群了,同时下面会列出两种集群搭建方式,第一种是测试机部署在不同的服务器上,第二种是测试机通过docker部署在同一台服务器上。
配置分布式测试环境
- 所有机器需在同一个子网,关闭防火墙或开放RMI端口(默认1099)。
- 确保主控机能通过IP或主机名访问所有测试机机。
第一种测试机部署在不同的服务器上:
测试机配置:
Jmeter在所有测试机上添加配置,打开bin/目录下的 jmeter.properties 文件,在每台负载机的jmeter.properties
中设置:
server_port=1099
server.rmi.ssl.disable=true
主控机配置:
在jmeter.properties
中列出所有测试机IP
remote_hosts=192.168.1.101,192.168.1.102
启动主控机服务:
如果是在Linux环境上部署的主控机,需要开两个会话,其中一个会话启动服务,另外一个会话来下发测试计划和收集结果。
以下为各自会话启动命令:
1、./jmeter-server
2、./jmeter -n -t 刷新性能测试计划.jmx -R 192.168.1.101:1099,192.168.1.102:1099 -l result.jtl -e -o test/
第二种测试机通过docker部署在同一台服务器上:
首先通过dockerfile构建出需要的jmeter镜像,以下为本人测试期间编写的dockerfile,可以根据自己的实际情况调整。
1、创建dockerfile:
FROM registry.cn-hangzhou.aliyuncs.com/acs/centos:7ARG JMETER_VERSION=5.5
ENV JMETER_HOME=/opt/apache-jmeter-${JMETER_VERSION}/apache-jmeter-${JMETER_VERSION}
ENV PATH=$JMETER_HOME/bin:$PATHRUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-Base.repo && \sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-Base.repo && \yum makecache fast && \yum -y update && \yum -y install wget curl tar && \yum clean allCOPY apache-jmeter-${JMETER_VERSION}.tgz /tmp/
RUN tar -xzf /tmp/apache-jmeter-${JMETER_VERSION}.tgz -C /opt && \rm /tmp/apache-jmeter-${JMETER_VERSION}.tgz && \chmod +x ${JMETER_HOME}/bin/jmeter ${JMETER_HOME}/bin/jmeter-serverCOPY jdk-8u461-linux-x64.tar.gz /tmp/
RUN tar -xzf /tmp/jdk-8u461-linux-x64.tar.gz -C /opt && \rm /tmp/jdk-8u461-linux-x64.tar.gz && \alternatives --install /usr/bin/java java /opt/jdk1.8.0_461/bin/java 1 && \alternatives --install /usr/bin/javac javac /opt/jdk1.8.0_461/bin/javac 1WORKDIR /jmeterCOPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.shENTRYPOINT ["/entrypoint.sh"]
2、创建dockerfile钟使用的entrypoint.sh脚本:
#!/bin/bash
set -eif [[ "$1" == "jmeter" && "$2" == "-n" ]]; thenexec jmeter "$@"
fiif [[ "$MODE" == "slave" ]]; thenexport JVM_ARGS="-Xms${Xms:-256m} -Xmx${Xmx:-1g} ${JVM_EXTRA_ARGS:-}"exec jmeter-server \-Dserver_port=${SERVER_PORT:-1099} \-Dserver.rmi.localport=${RMI_LOCAL_PORT:-50000} \-Dserver.rmi.port=${SERVER_RMI_PORT:-1099} \-Djava.rmi.server.hostname=${HOST_IP:-$(hostname -i)}
fiexec "$@"
Dockerfile个别参数注意点!!!!
1、所有测试机使用jdk版本,必须和控制机下发的测试计划中使用的jdk版本保持一致,不然会出现一些错误,导致测试机不能正常执行任务。
2、下载jmeter镜像和需要用到的额外插件如果网络好的情况下可以在构建进行的时候下载,如果不好的情况下可以和我一样,在window环境下安装好jmeter工具和扩展插件,然后打包自己jmeter安装路径下的所有包上传到自己的服务器上,然后再构建镜像的时候copy进去。
3、JMETER_VERSION参数的值可以根据自己下载的jmeter版本进行修改。
3、镜像构建好之后,可以通过如下命令启动jmter实例。
docker run -d --name slave3 -e MODE=slave -e HOST_IP=192.168.1.12 -e SERVER_PORT=1013 -e RMI_LOCAL_PORT=50003 -e SERVER_RMI_PORT=1013 -e Xms=512m -e Xmx=1g -p 1013:1013 -p 50003:50003 my-jmeter:5.5-centos
可以通过这条命令来启动多个jmeter实例,只需要修改IP和Port即可,jmeter的RMI默认端口为1099,但是咋们也可以自己修改RMI端口,修改参数SERVER_RMI_PORT端口的值即可。
测试机配置:
由于已经通过docker在启动实例的时候配置好环境变量了,这里就不需要和第一种方式一样去jmeter.properties中修改server_port参数,只需要修改server.rmi.ssl.disable=true。
主控机配置:
这里主控机配置与第一种方式有一点不同,在jmeter.properties
中列出所有测试机IP的时候,因为没有使用RMI通信的默认端口,所以需要在ip后面带上端口:
remote_hosts=192.168.1.101:1013,192.168.1.102:1015
主控机的启动方式和第一种一样,这里就不在重复了,只需要修改参数中的端口,改为自己测试机使用的RMI通信端口。
最终在测试计划运行结束之后,主控机会出现xxx.jtl文件,可以下载到windos下,通过GUI的Jmeter打开来查看执行情况,也可以下载上面配置的报告生产路径的内容来查看。