性能测试工具JMeter的分布式执行是一种用于增强压力测试能力的技术方案,它允许用户通过多台机器来共同完成同一个测试计划的执行。这种方式特别适用于需要模拟成百上千甚至上万用户并发访问的情况,当单台机器由于硬件资源(如CPU、内存、网络I/O等)限制无法满足高并发需求时,分布式执行可以有效地解决这个问题。
分布式执行原理
在JMeter的分布式架构中,通常会有一台机器作为控制机(Controller或Master),负责管理和协调整个测试过程;其他参与测试的机器则被称为执行机(Agent或Slave)。
具体来说:
控制机:安装有JMeter客户端,并且配置了与所有执行机通信所需的设置。它可以是Windows或Linux系统,但建议使用独立于执行机之外的机器以避免资源竞争。
执行机:同样安装了JMeter软件,并且根据控制机发送过来的指令执行相应的测试任务。这些机器不需要启动GUI界面,而是以命令行模式运行,从而减少不必要的资源消耗。
通信机制:控制机和执行机之间通过RMI(Remote Method Invocation)协议进行通信,默认情况下使用端口1099。为了保证安全性和效率,可以在jmeter.properties文件中禁用SSL加密或者自定义端口号。
运行模式如下图所示:
Master 端和Slave 端通过RMI(Remote Method Invocation)的模式通信,Master控制场景的配置,执行及结果收集,Slave负责产生负载,把测试结果回传给Master。
Jmeter分布执行过程大致如下:
1> Slave 端启动(%JMETER_HOME%/bin/jmeter-server).
2>Master 端启动执行。Master端解析测试计划 Hash Tree,从配置文件中读取Slave 端地址(可以是N个,N>=1),建立连接。例如参数文件,这些文件不会自动发送Slave端的,需要用户自己存放到Slave端。
3>Slave端连接到Hash Tree 与启动命令行,运行测试计划,并把测试结果返回给Master端;每个Slave端上运行的测试计划完全一样,例如,在Master端上设置的线程数为100,那么总线程数为100*N,其中N 为Slave的个数。
配置步骤
要实现JMeter的分布式执行,首先需要确保所有涉及的机器都安装了相同版本的JDK和JMeter,并且正确设置了环境变量。接着按照以下步骤操作:
修改配置文件:在每台执行机上的bin/jmeter.properties文件中添加如下配置项:
server.rmi.ssl.disable=true // 禁用SSL
server_port=指定端口 // 设置监听端口,例如1888
server.rmi.localport=指定端口 // 设置本地RMI端口,保持一致
启动服务:进入JMeter安装目录下的bin文件夹,执行jmeter-server.bat(Windows)或./jmeter-server(Linux)命令来启动远程服务器实例。
配置控制机:编辑控制机上的bin/jmeter.properties文件,在其中加入所有执行机的信息,格式为remote_hosts=IP地址:端口号,IP地址:端口号...。例如:remote_hosts=192.168.1.102:1888,192.168.1.103:1888。
启动测试:打开JMeter GUI界面,加载要执行的测试计划(.jmx文件),然后选择"运行"->"远程启动",可以选择单独启动某一台执行机,也可以点击"远程全部启动"让所有配置好的执行机同时开始工作。
使用SSL
Jmeter从4.0版本以后,RMI的默认传输机制将使用SSL,因此我们要配置密钥和证书。解决方式有两种,一种是忽略SSL,另外一种方式生成密钥和证书,然后进行配置。
%JMETER_HOME%/bin/ 目录下有create-rmi-keystor.bat,create-rmi-keystor.sh 两个文件分别为windows 系统和Linux系统下生成密钥证书。
create-rmi-keystor.bat 支持windows系统生成密钥和证书
Windows系统下生成的证书。
create-rmi-keystor.sh 支持Linux系统生成密钥和证书。
把生成的证书拷贝到其它待用的机器上,配置不做任何修改,保持默认即可。
启动Slave端,在Linux系统下运行%JMETER_HOME%/bin/jmeter-server,在windows系统下运行Jmeter-server.bat。默认的监听端口号1099,如果需要修改,则在jmeter.properties中设置的server_prot=[端口],同时在Master端的Jmeter.properties 文件中设置remote_hosts=server:[端口]。
注意事项
所有机器应该处于同一局域网内,并且关闭防火墙或开放必要的端口以便于通信。
如果使用CSV文件或其他外部数据源进行参数化,则需确保这些文件存在于每个执行机相同路径下。
为了避免潜在的问题,最好保证所有参与测试的机器拥有相同的JMeter版本及插件配置。
通过上述方法可以成功搭建起一个基于JMeter的分布式压测环境,这对于评估Web应用或其他服务在大规模并发条件下的表现具有重要意义。此外,随着技术的发展,一些第三方平台也提供了对JMeter分布式部署的支持和服务,进一步简化了这一过程。
阅读后若有收获,不吝关注,分享,在看等操作!!!