2025-04-30
jmeter基础
00
请注意,本文编写于 233 天前,最后修改于 233 天前,其中某些信息可能已经过时。

目录

一、前言
1.为什么要做分布式:
2.分布式的目的
二、Jmeter分布式的原理
1. Jmeter分布式测试时,选择一台为控制机,其他机器作为代理机。
2. 执行时,控制机会将脚本发送到每台代理机上,代理机拿到脚本后开始执行,代理机执行时不需要启动Jmeter,只需在jmeter安装的bin目录下以命令行模式启动jmeter-server。
3. 执行后,代理机会把结果回传给控制机,控制机会收集所有代理机的信息并汇总。
4. 图2-4-1为本次分布式压测的原理图,图示展示本次演示的控制机IP,代理机IP以及被测服务的IP,控制机下发测试脚本到每台执行机,然后控制机收集代理机的执行结果。
三、环境准备
1. Jmeter控制机与代理机的防火墙已关闭
2. 所有控制机与代理机的jmeter版本要完全一致,本次使用的Jmeter版本为Apache Jmeter(5.6.2)
3. 所有控制机与代理机的jdk版本要一致,本次使用的jdk版本为1.8.0_71,以下为本次使用的Jmeter与jdk的压缩包
4. 所有控制机与代理机的插件包可以正常使用,且插件包的要一致,若未安装jmeter插件请跳过此步骤。
(1)下载Jmeter证书如图3-4-2,谷歌浏览器访问
(2)安装Jmeter证书:mac系统管理员账号进入jdk安装目录:sudo su ; windows以管理运行cmd进入jdk安装目录。执行:./keytool -import -alias JMeter -keystore ../lib/security/cacerts -file "/Users/wodediannao/Downloads/tools/apache-jmeter-5.5/bin/jmeter-plugins.org.cer"
① 输入:changeit(输入密码时要注意输入法的状态)
② 信任证书
③ 验证证书是否安装成功:./keytool -list -keystore ../lib/security/cacerts -alias JMeter
(3)最后重启Jmeter即可:
5. Jmeter的分布式的实施没有对控制机与代理机的系统做限制。理论上来说,windows、linux、mac电脑做控制机与代理机的操作系统都可以,但是所有代理机均在同一子网中,控制机连接代理机均采用有线连接,控制机不要用wifi连接。
6. 本次实施环境如表3-4-6所示:
四、控制机配置
1、修改控制机jmeter.properties文件中的参数,该配置文件在Jmeter安装目录的bin目录下。
(1)jmeter.properties文件中346行左右将server.rmi.ssl.disable=true
(2)文件中的771行左右,将mode=Standard取消注释,目的是:控制机可以接收到执行机的测试结果。
(3)文件中269行左右,添加代理机的IP与端口,有几台执行机就添几台执行机与端口,彼此之间以逗号分隔。
2、传给代理机控制机的密钥
(1)由于在Jmeter4.0版本之后,为了安全,分布式压测需要控制机生成密钥--代理机授权,分布式才可以正常实现。
(2)打开控制机的bin目录下的create-rmi-keystore.sh文件,windows系统下安装的Jmeter打开create-rmi-keystore.bat文件,复制图4-2-1所圈示的命令。
(3)找到jdk并进入jdk的bin目录中(命令行模式)mac:/Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home/bin windows:C:\Program Files\Java\jdk-1.8\bin以管理员模式执行圈2中复制的命令,执行成功如下图所示,并根据提示引导填写信息:
(4)完成后会在上述目录中生成一个jks文件,如下图4-4-1所示。
(5)然后将这个配置文件,复制粘贴给所有执行机中jmeter的bin目录中(windows、linux系统同理)
五、代理机配置
1、修改代理机jmeter.properties文件中的参数,该配置文件在Jmeter安装目录的bin目录下。
(1)jmeter.properties文件中346行左右将server.rmi.ssl.disable=true
(2)文件中的771行左右,将mode=Standard取消注释,目的是:控制机可以接收到执行机的测试结果。
(3)文件中267行与272行左右,将remotehosts=127.0.0.1与serverport=1099取消注释。
2、将代理机网络适配器中的虚拟网络适配器禁用掉。(该步骤针对代理机安装过虚拟机的情况下)
(1)代理机查看本机网络代理,若执行机中不存在虚拟网适配器则跳过此步骤。
(2)将代理机中所有虚拟网络适配器禁用掉,如图5-2-1所示。设置—>网络和Internet—>更改网络适配器选项
(3)控制机与代理机网络连接测试。
① windows控制机使用ping命令确认控制机与代理机能否正常通信。 ping hostname(代理机的ip),成功如下图5-3-1所示:
② mac控制机使用nc工具测试端口联通性nc -zv hostname port(代理机的ip与端口),成功如下图5-3-2所示:
若测试端口联通性不通过:
windows代理机:
① 先win+r打开运行,输入control进入控制面板,如图5-4-1
② 将控制面板的类别更改为小图标,找到windows Defender防火墙。如下图5-4-2所示
③ 找到高级设置,如图5-4-3所示
④ 点击入站规则—>新建规则,如图5-4-4所示
⑤ 选择端口—>下一页—>填写1099端口—>下一页,如图5-4-5所示
⑥ 之后一直下一页,输入名称点击完成,如图5-4-6所示:
⑦ 再次进行控制机与代理机的联通性测试
mac代理机:
① 打开终端,并使用命令:sudo nano /etc/pf.conf 编辑’pf.conf’文件,输入密码,进入文件中。
② 添加规则:在文件末尾添加允许1099端口的规则:pass in proto tcp from any to any port 1099,如图5-4-7所示:
③ 加载新的防火墙规则,保存并关闭编辑器后,使用以下命令加载新的防火墙规则:
④ 检查端口是否打开,在mac的jmeter的bin目录下执行命令:jmeter-server -Djava.rmi.server.hostname=192.168.55.70 -Dserver_port=1099,单开一个端口执行命令sudo lsof -i :1099监控该服务,若能够监听到则1099端口成功开启,如图5-4-8所示
3、若jmeter脚本中使用了csv进行参数化,需要把参数化文件在每台slave拷贝一份,最好都放在bin目录下,因为Jmeter会直接从bin目录下查找,jmeter脚本中的参数化文件的路径尽量使用相对路径,本次搭建的Demo脚本使用了员工信息.csv文件,如下图所示,找到文件位置放到代理机的Jmeter的bin目录下。
六、运行
1. 代理机启动,在每台执行机的命令行模式下进入Jmeter安装的bin目录下,执行命令:jmeter-server -Djava.rmi.server.hostname=[代理机的ip] ,启动成功如下图6-1-1所示,一定要仔细查看启动后的IP图片标红部分与执行机的IP一致
2. 控制机启动
(1) GUI模式远程启动,选择代理机,如果都要执行,则选择“远程启动所有”
(2) 非GUI模式
① /Library/jmeter-achievement/XXXXXX.jmx:为控制机中要运行脚本的位置。
② 192.168.55.70,192.168.55.71:为代理机的IP地址。
③ -Jhttpclient.timeout=30000-Jhttpclient4.socket.timeout=30000:设置连接与响应超时时间为30000ms
④ XXXXXX/Desktop/Output/result/result03.jtl:其中result文件夹为存放测试结果的文件,注意在压测前确保result文件夹为空或者没有与result03.jtl相同的文件名
⑤ XXXXXX/Desktop/Output/report/report03:其中report文件夹为存放测试报告的文件夹,注意在压测前确保report文件夹为空或者没有与report03相同的文件夹
非GUI模式运行成功后,控制机命令执行终端如下图6-2-3所示:
非GUI模式运行时常见的报错信息:
① 报错信息: Non HTTP response code: java.net.UnknownHostException/Non HTTP response message: dltime.ecoits.com。报错信息 Non HTTP response code: java.net.UnknownHostException / Non HTTP response message: dltime.ecoits.com 表示 JMeter 在尝试访问 dltime.zktecoits.com 时遇到了 DNS 解析失败的问题。
解决:
在Jmeter分布式压测中,如果遇到DNS解析失败的问题,通常需要确保控制机和代理机的DNS配置都是正确的,因为请求可以在控制机和代理机上发生。以下是针对控制机与代理机的DNS配置步骤:
Windows操作系统:
打开“控制面板”—>选择“网络和共享中心”—>点击当前网络连接—>点击属性—>选择“Internet协议版本4(TCP/IPv4)”并点击“属性”—>在“首选DNS服务器”与“备选DNS服务器”输入主流好用的DNS,如下图6-2-5操作:
MAC操作系统:
① 打开终端使用命令sudo nano /etc/resolv.conf编辑文件,在文件中添加以下两行,之后CRTROL+O保存—>ENTER—>CRTROL+X退出:
② 报错信息:Non HTTP response code: org.apache.http.conn.ConnectTimeoutException/Non HTTP response message: Connect to dltime.zktecoits.com:443 [dltime.ecoits.com/121.12.147.155] failed: Read timed out报错信息说明了在连接到 dltime.zktecoits.com 的 443 端口时发生了读取超时异常
解决:在控制机与代理机上执行ping dltime.ecoits.com,若存在丢包的情况则检查网络是否稳定;若不存在丢包的情况下则减少并发数量再次尝试。

一、前言

1.为什么要做分布式:

  • 一台压力机的Jmeter默认最大支持1000左右的并发用户数,此临界点极易造成卡顿、无响应等情况,这是受限于Jmeter本身的机制和压力机的硬件配置。
  • Jmeter是Java应用,对压力机的CPU和内存的消耗较大,在模拟大量并发用户时,单压力机很容易出现JAVA内存溢出的错误,导致测试中断。

2.分布式的目的

  • 确保压力机不会出现性能瓶颈。
  • 在测试结果分析时,不考虑压力机对测试结果的影响。

二、Jmeter分布式的原理

1. Jmeter分布式测试时,选择一台为控制机,其他机器作为代理机。

2. 执行时,控制机会将脚本发送到每台代理机上,代理机拿到脚本后开始执行,代理机执行时不需要启动Jmeter,只需在jmeter安装的bin目录下以命令行模式启动jmeter-server。

3. 执行后,代理机会把结果回传给控制机,控制机会收集所有代理机的信息并汇总。

4. 图2-4-1为本次分布式压测的原理图,图示展示本次演示的控制机IP,代理机IP以及被测服务的IP,控制机下发测试脚本到每台执行机,然后控制机收集代理机的执行结果。

image.png

三、环境准备

1. Jmeter控制机与代理机的防火墙已关闭

2. 所有控制机与代理机的jmeter版本要完全一致,本次使用的Jmeter版本为Apache Jmeter(5.6.2)

3. 所有控制机与代理机的jdk版本要一致,本次使用的jdk版本为1.8.0_71,以下为本次使用的Jmeter与jdk的压缩包

jmeter下载地址
JDK下载地址

4. 所有控制机与代理机的插件包可以正常使用,且插件包的要一致,若未安装jmeter插件请跳过此步骤。

  • 若打开Plugins Manager产生如图3-4-1下报错: 图3-4-1
  • 解决:

(1)下载Jmeter证书如图3-4-2,谷歌浏览器访问

image.png

(2)安装Jmeter证书:mac系统管理员账号进入jdk安装目录:sudo su ; windows以管理运行cmd进入jdk安装目录。执行:./keytool -import -alias JMeter -keystore ../lib/security/cacerts -file "/Users/wodediannao/Downloads/tools/apache-jmeter-5.5/bin/jmeter-plugins.org.cer"

image.png

① 输入:changeit(输入密码时要注意输入法的状态)
② 信任证书
③ 验证证书是否安装成功:./keytool -list -keystore ../lib/security/cacerts -alias JMeter

image.png

(3)最后重启Jmeter即可:

image.png

5. Jmeter的分布式的实施没有对控制机与代理机的系统做限制。理论上来说,windows、linux、mac电脑做控制机与代理机的操作系统都可以,但是所有代理机均在同一子网中,控制机连接代理机均采用有线连接,控制机不要用wifi连接。

6. 本次实施环境如表3-4-6所示:

客户端IP地址控制机/代理机居中对齐
Mac192.168.55.72控制机Jmeter 5.6.2 ,jdk 1.8.0_71
windows192.168.55.71代理机Jmeter 5.6.2 ,jdk 1.8.0_71
windows192.168.55.70代理机Jmeter 5.6.2 ,jdk 1.8.0_71

四、控制机配置

1、修改控制机jmeter.properties文件中的参数,该配置文件在Jmeter安装目录的bin目录下。

(1)jmeter.properties文件中346行左右将server.rmi.ssl.disable=true

image.png

(2)文件中的771行左右,将mode=Standard取消注释,目的是:控制机可以接收到执行机的测试结果。

image.png

(3)文件中269行左右,添加代理机的IP与端口,有几台执行机就添几台执行机与端口,彼此之间以逗号分隔。

image.png

2、传给代理机控制机的密钥

(1)由于在Jmeter4.0版本之后,为了安全,分布式压测需要控制机生成密钥--代理机授权,分布式才可以正常实现。

(2)打开控制机的bin目录下的create-rmi-keystore.sh文件,windows系统下安装的Jmeter打开create-rmi-keystore.bat文件,复制图4-2-1所圈示的命令。

image.png

(3)找到jdk并进入jdk的bin目录中(命令行模式)mac:/Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home/bin windows:C:\Program Files\Java\jdk-1.8\bin以管理员模式执行圈2中复制的命令,执行成功如下图所示,并根据提示引导填写信息:

image.png

(4)完成后会在上述目录中生成一个jks文件,如下图4-4-1所示。

image.png

(5)然后将这个配置文件,复制粘贴给所有执行机中jmeter的bin目录中(windows、linux系统同理)

五、代理机配置

1、修改代理机jmeter.properties文件中的参数,该配置文件在Jmeter安装目录的bin目录下。

(1)jmeter.properties文件中346行左右将server.rmi.ssl.disable=true

image.png

(2)文件中的771行左右,将mode=Standard取消注释,目的是:控制机可以接收到执行机的测试结果。

image.png

(3)文件中267行与272行左右,将remote_hosts=127.0.0.1与server_port=1099取消注释。

image.png

2、将代理机网络适配器中的虚拟网络适配器禁用掉。(该步骤针对代理机安装过虚拟机的情况下)

(1)代理机查看本机网络代理,若执行机中不存在虚拟网适配器则跳过此步骤。

image.png

(2)将代理机中所有虚拟网络适配器禁用掉,如图5-2-1所示。设置—>网络和Internet—>更改网络适配器选项

image.png

(3)控制机与代理机网络连接测试。

命令行模式进入代理机jmeter安装的bin目录下,执行命令:jmeter-server -Djava.rmi.server.hostname=192.168.55.70 -Dserver-port=1099

① windows控制机使用ping命令确认控制机与代理机能否正常通信。 ping hostname(代理机的ip),成功如下图5-3-1所示:

image.png

② mac控制机使用nc工具测试端口联通性nc -zv hostname port(代理机的ip与端口),成功如下图5-3-2所示:

image.png

若测试端口联通性不通过:

windows代理机:

① 先win+r打开运行,输入control进入控制面板,如图5-4-1

image.png

② 将控制面板的类别更改为小图标,找到windows Defender防火墙。如下图5-4-2所示

image.png

③ 找到高级设置,如图5-4-3所示

image.png

④ 点击入站规则—>新建规则,如图5-4-4所示

image.png

⑤ 选择端口—>下一页—>填写1099端口—>下一页,如图5-4-5所示

image.png

⑥ 之后一直下一页,输入名称点击完成,如图5-4-6所示:

image.png

⑦ 再次进行控制机与代理机的联通性测试

mac代理机:

① 打开终端,并使用命令:sudo nano /etc/pf.conf 编辑’pf.conf’文件,输入密码,进入文件中。
② 添加规则:在文件末尾添加允许1099端口的规则:pass in proto tcp from any to any port 1099,如图5-4-7所示:

image.png

③ 加载新的防火墙规则,保存并关闭编辑器后,使用以下命令加载新的防火墙规则:

sudo pfctl -f /etc/pf.conf
sudo pfctl -e

④ 检查端口是否打开,在mac的jmeter的bin目录下执行命令:jmeter-server -Djava.rmi.server.hostname=192.168.55.70 -Dserver_port=1099,单开一个端口执行命令sudo lsof -i :1099监控该服务,若能够监听到则1099端口成功开启,如图5-4-8所示

image.png

3、若jmeter脚本中使用了csv进行参数化,需要把参数化文件在每台slave拷贝一份,最好都放在bin目录下,因为Jmeter会直接从bin目录下查找,jmeter脚本中的参数化文件的路径尽量使用相对路径,本次搭建的Demo脚本使用了员工信息.csv文件,如下图所示,找到文件位置放到代理机的Jmeter的bin目录下。

image.png

六、运行

1. 代理机启动,在每台执行机的命令行模式下进入Jmeter安装的bin目录下,执行命令:jmeter-server -Djava.rmi.server.hostname=[代理机的ip] ,启动成功如下图6-1-1所示,一定要仔细查看启动后的IP图片标红部分与执行机的IP一致

image.png

2. 控制机启动

(1) GUI模式远程启动,选择代理机,如果都要执行,则选择“远程启动所有”

image.png 启动成功后,控制机的查看结果树与聚合报告均有测试结果返回如图6-2-1;且代理机的产生服务日志信息如下图6-2-2所示

image.png

image.png

(2) 非GUI模式

非GUI模式下,终端模式下进入jmeter安装的bin目录下,执行如下命令: jmeter -n -t /Library/jmeter-achievement/XXXXXXX.jmx -R 192.168.55.70,192.168.55.71 -Jhttpclient.timeout=30000 -Jhttpclient4.socket.timeout=30000 -l /Users/zkteco/Desktop/Output/result/result_03.jtl -e -o /Users/zkteco/Desktop/Output/report/report_03 针对以上命令在此做如下解析:

① /Library/jmeter-achievement/XXXXXX.jmx:为控制机中要运行脚本的位置。
② 192.168.55.70,192.168.55.71:为代理机的IP地址。
③ -Jhttpclient.timeout=30000-Jhttpclient4.socket.timeout=30000:设置连接与响应超时时间为30000ms
④ XXXXXX/Desktop/Output/result/result_03.jtl:其中result文件夹为存放测试结果的文件,注意在压测前确保result文件夹为空或者没有与result_03.jtl相同的文件名
⑤ XXXXXX/Desktop/Output/report/report_03:其中report文件夹为存放测试报告的文件夹,注意在压测前确保report文件夹为空或者没有与report_03相同的文件夹

非GUI模式运行成功后,控制机命令执行终端如下图6-2-3所示:

image.png 点开report_03文件夹下的index.html文件查看测试报告,如下图所示6-2-4所示:

image.png

非GUI模式运行时常见的报错信息:

① 报错信息: Non HTTP response code: java.net.UnknownHostException/Non HTTP response message: dltime.ecoits.com。报错信息 Non HTTP response code: java.net.UnknownHostException / Non HTTP response message: dltime.ecoits.com 表示 JMeter 在尝试访问 dltime.zktecoits.com 时遇到了 DNS 解析失败的问题。

解决:

在Jmeter分布式压测中,如果遇到DNS解析失败的问题,通常需要确保控制机和代理机的DNS配置都是正确的,因为请求可以在控制机和代理机上发生。以下是针对控制机与代理机的DNS配置步骤:

Windows操作系统:
打开“控制面板”—>选择“网络和共享中心”—>点击当前网络连接—>点击属性—>选择“Internet协议版本4(TCP/IPv4)”并点击“属性”—>在“首选DNS服务器”与“备选DNS服务器”输入主流好用的DNS,如下图6-2-5操作:

image.png

MAC操作系统:
① 打开终端使用命令sudo nano /etc/resolv.conf编辑文件,在文件中添加以下两行,之后CRTROL+O保存—>ENTER—>CRTROL+X退出:

nameserver 8.8.8.8
nameserver 8.8.4.4

② 报错信息:Non HTTP response code: org.apache.http.conn.ConnectTimeoutException/Non HTTP response message: Connect to dltime.zktecoits.com:443 [dltime.ecoits.com/121.12.147.155] failed: Read timed out报错信息说明了在连接到 dltime.zktecoits.com 的 443 端口时发生了读取超时异常
解决:在控制机与代理机上执行ping dltime.ecoits.com,若存在丢包的情况则检查网络是否稳定;若不存在丢包的情况下则减少并发数量再次尝试。

本文作者:精卫

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!