八、JMeter分布式压测

1. 基本介绍

(1) 与单机压测对比

  • 单机压测:单台机可以对目标机器产生的压力比较小,受限因素包括CPU,网络,IO等
  • 分布式压测:利用多台机器向目标机器产生压力,模拟几万用户并发访问
    请添加图片描述

(2) 原理

  • 专业名词
    • Master: 司令,即总控机器的节点
    • Slave: 奴隶,即产生压力的“肉鸡” server 机器
    • Target: 被压测的目标机器
  1. 配置以关联 Master 与 Slave
  2. 启动 Slave 的 jmeter-server
  3. Master 将压测脚本发送到 Slave 上面执行
  4. 压测结束后,Slave 将结果数据回传给 Master ,然后 Master汇总输出报告
    请添加图片描述
    请添加图片描述
    请添加图片描述

(3) 注意事项

官网给出了一些注意事项

  • 系统上的防火墙被关闭或正确的端口被打开。
    the firewalls on the systems are turned off or correct ports are opened.
  • 所有的客户端都在同一个子网上。
    all the clients are on the same subnet.
  • 如果使用192.x.x.x或10.x.x.x IP地址,则服务器位于同一子网中。 如果服务器不使用192.xx或10.xx IP地址,则不应该有任何问题。(jmeter脚本文件里的目标地址一定要用内网IP,不要用公网IP,不然流量会都卡在带宽上。用ping去检查是否连通)
    the server is in the same subnet, if 192.x.x.x or 10.x.x.x IP addresses are used. If the server doesn’t use 192.xx or 10.xx IP address, there shouldn’t be any problems.
  • 确保JMeter可以访问服务器。
    Make sure JMeter can access the server.
  • 确保在所有系统上使用相同版本的JMeter和Java。 混合版本将无法正常工作。
    Make sure you use the same version of JMeter and Java on all the systems. Mixing versions will not work correctly.
  • 您已为RMI设置SSL或将其禁用。
    You have setup SSL for RMI or disabled it.

2. 准备工作

(1) 远程拷贝

当有一台Linux中存在某文件,可以通过scp命令将它拷贝到其他Linux机器,尤其是使用内网地址传输时,更显快速

scp -r <当前机器中待拷贝文件所在目录> root@<IP>:<目标机器中副本文件的存放目录(已存在)>

在分布式压测的准备工作中,可以使用该命令将jdk和jmeter复制到各slave机器中
请添加图片描述

(2) 启动 Slave

有以下两种启动方式

1) 直接启动

可看到压测效果和日志

./jmeter-server

2) 守护进程方式启动

nohup ./jmeter-server &

检查是否启动成功

ps -ef|grep jmeter-server
ps aux|grep jmeter-server

3. 常见问题

(1) UnknownHostException

[root@iZwz95j86y235aroi85ht0Z bin]# ./jmeter-server
	Created remote object: UnicastServerRef2 [liveRef: [endpoint:[:39308](local),objID:[24e78a63:16243c70661:-7fff, 7492480871343944173]]]
	Server failed to start: java.rmi.RemoteException: Cannot start. Unable to get local host IP address.; nested exception is:
	java.net.UnknownHostException: iZwz95j86y235aroi85ht0Z: iZwz95j86y235aroi85ht0Z: Name or service not known
	An error occurred: Cannot start. Unable to get local host IP address.; nested exception is:
	java.net.UnknownHostException: iZwz95j86y235aroi85ht0Z: iZwz95j86y235aroi85ht0Z: Name or service not known

解决方案

hostname 命令获取机器名称,追加一个映射:iZwz95j86y235aroi85ht0Z

vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
120.79.160.143 iZwz95j86y235aroi85ht0Z

windows用户 修改c:\windows\system32\drivers\etc\hosts文件,增加一条域名 与IP的映射

(2) FileNotFoundException

[root@iZwz95j86y235aroi85ht0Z bin]# ./jmeter-server
	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)
	An error occurred: Listen failed on port: 0; nested exception is:
	java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)

解决方案

拥有RMI over SSL的有效密钥库,或者禁用了SSL
jmeter.property里面 server.rmi.ssl.disable 改为 true,表示禁用

(3) Cannot allocate memory

[root@iZ949uw2xehZ bin]# ./jmeter
		Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Cannot allocate memory' (errno=12)
		#
		# There is insufficient memory for the Java Runtime Environment to continue.
		# Native memory allocation (mmap) failed to map 1073741824 bytes for committing reserved memory.
		# An error report file with more information is saved as:
		# /usr/local/jmeter/apache-jmeter-4.0/bin/hs_err_pid5855.log

解决方案

  1. 编辑jmeter
  2. 搜索 : “${HEAP:=”-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"}"
  3. 改变初始堆内存和最大堆内存

(4) Server Port

解决方案

仅修改 server_port 即可,下面两者一样

  • server.rmi.localport=8899 表示slave server启动显示的端口
  • server_port=8899 表示master机器要远程连接的端口,即 remote_hosts=xxxx:8899

(5) 多网卡配置

解决方案

我们要在多网卡的服务器上开启RMI服务的话必须指定IP,使他们能够在同一个网段内
需要以下几步(假定所有机器都在10.120.11.*网段,agent服务器为linux,controller服务器为windows)

  1. 修改agent服务器,指定agent机器的IP
    1. 修改jmeter-server文件
      # vi jmeter-server
    2. 修改RMI_HOST_DEF=-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx(需要连接的IP)
  2. 修改server服务器,指定server机器的IP
    1. 修改jmeter.bat文件
    2. 新增set rmi_host=-Djava.rmi.server.hostname=10.120.11.214
    3. 修改set ARGS=%DUMP% %HEAP% %NEW% %SURVIVOR% %TENURING% %PERM% %DDRAW% %rmi_host%

(6) 工具安装

解决方案

  1. 确定在controller机器上安装jdk,版本和jmeter一致,配置环境变量:Java_home等
  2. 在Agent机器上安装jdk,配置环境变量:Java_home和JMeter_home
  3. 安装目录不要带空格,最好都是简短的英文路径

(7) 压测文件

解决方案

  1. master机器启动后会拷贝jmx文件到slave机器,所以不需要在每台slave机器上也上传一份jmx,只需要在master机器上上传一份jmx脚本即可
    总样本数 = 线程数 * 循环次数 * 执行机总数
  2. 如果使用csv进行参数化,则需要把参数文件在每台slave上拷一份且路径需要设置成一样的

(8) 连接失败

解决方案

按照以下步骤进行排查:

  1. jmeter-server是否启动
  2. 是否联网
  3. ping 服务器IP是否畅通
  4. telnet 端口 192.168.3.10 1099
  5. 检查服务器的防火墙是否关闭
  6. 阿里云安全策略是否正常

(9) could not find ApacheJmeter_core.jar

解决方案

在Agent机器安装jdk,并设置环境变量

(10) Bad call to remote host

解决方案

检查被控制机器上的jmeter-server有没有启动,或者remote_hosts的配置是否正确

(11) Loopback Address

请添加图片描述

解决方案

编辑jmeter-server,设置固定的代理服务器主机IP
请添加图片描述
请添加图片描述
请添加图片描述

(12) Connection Refused

  • 现象:Master远程启动Slave机器报错:Connection refused
  • 原因:Master有多个IP:公网&局域网IP,JMeter默认读取公网IP,就会认为Master和Slave不在同个局域网内

请添加图片描述

解决方案

编辑Master的jmeter.bat,设置JMeter的自身启动IP为局域网IP

添加 set rmi_host=-Djava.rmi.server.hostname=<Master的局域网IP>set ARGS 行末加上 %rmi_host%

请添加图片描述

(13) Response Body 为空

不算问题,但也能让它显示

  • 现象:Master远程启动Slave压测有结果但结果树中不返回接口数据
  • 原因:远程启动,查看结果树,正确的话不会有返回值,错误才有返回值
    请添加图片描述

解决方案

编辑Master的jmeter.properties,放开“mode=Standard”的注释并保存
请添加图片描述
重启JMeter后重试发现结果树中已显示返回值
请添加图片描述

4. 实战

(1) 编辑 jmeter.properties

1) remote_hosts

只有Master需要改

remote_hosts=<Slave0Ip:Port>,<Slave1Ip:Port>,...

请添加图片描述

2) server.rmi.ssl.disable

Master和各Slave都需要改

server.rmi.ssl.disable=true

请添加图片描述
请添加图片描述

请添加图片描述

(2) 启动 Slave

注意:各 Slave 防火墙已关闭,且在同个网段,IP 地址用内网 IP

./jmeter-server

请添加图片描述

(3) 启动 Master

1) 编辑压测脚本

请添加图片描述
请添加图片描述

2) 远程启动 Slave

a. GUI

可以选择启动全部或其中一个 Slave
请添加图片描述
请添加图片描述
请添加图片描述

b. 非 GUI

使用 -r 参数实现远程非 GUI 压测,可减少 CPU 和内存使用

jmeter -n -t <压测脚本文件名>.jmx -r -l <本不存在的结果文件名>.jtl -e -o <存放压测报告的空目录>

请添加图片描述

JMeter分布式压测是使用多台计算机同时执行JMeter测试计划,以模拟大量并发用户的压力。使用分布式压测可以有效提高负载能力,并避免单台机器的性能限制。在分布式压测中,一个JMeter主控节点负责管理所有的测试计划和生成结果报告,而多个JMeter工作节点则同时执行测试计划,并将结果返回给主控节点进行统计和分析。 要进行JMeter分布式压测,需要进行以下步骤: 1. 配置JMeter主控节点:在主控节点上,设置一个JMeter测试计划,并将其配置为分布式测试模式。在测试计划中,设置各个线程组、取样器和监听器等测试元素,以模拟真实的用户行为。 2. 配置JMeter工作节点:在每个工作节点上,安装并配置JMeter,并确保与主控节点在同一局域网中。工作节点需要拥有相同的测试计划文件和测试数据。 3. 启动主控节点:在主控节点上启动JMeter,并开始压测。主控节点会将测试计划和相关配置发送给各个工作节点,并收集并分析结果。 4. 启动工作节点:在每个工作节点上启动JMeter,并连接到主控节点。工作节点会接收主控节点发送的测试计划和相关配置,并执行测试计划。 5. 监控和分析结果:在压测过程中,可以通过主控节点的监听器查看实时结果,并在压测结束后生成详细的报告进行分析。 以上是JMeter分布式压测的基本流程。通过合理配置和管理分布式压测环境,可以更好地模拟真实的用户场景,评估系统的性能和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值