1. 准备工作
(1) 注意事项
官网给出了一些注意事项:
- 系统上的防火墙被关闭或正确的端口被打开。
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. - Make sure you use the same version of JMeter and Java on all the systems. Mixing versions will not work correctly.
确保在所有系统上使用相同版本的JMeter和Java。 混合版本将无法正常工作。 - 您已为RMI设置SSL或将其禁用。
You have setup SSL for RMI or disabled it.
(2) 专业名词
- Master: 司令
- Slave: 奴隶
- Target: 目标
(3) 远程拷贝
当有一台Linux中存在某文件,可以通过scp命令将它拷贝到其他Linux机器,尤其是使用内外地址传输时,更显快速
scp -r <当前机器中待拷贝文件所在目录> root@<IP>:<目标机器中副本文件的存放目录(已存在)>
在分布式压测的准备工作中,可以使用该命令将jdk和jmeter复制到各slave机器中
(4) 启动Slave
有以下两种启动方式
1) 直接启动
可看到压测效果和日志
./jmeter-server
2) 守护进程方式启动
nohup ./jmeter-server &
检查是否启动成功
ps -ef|grep jmeter-server
ps aux|grep jmeter-server
2. 常见问题
(1) UnknownHostException
[root@iZwz95j86y235aroi85ht0Z bin]
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]
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]
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Cannot allocate memory' (errno=12)
解决方案
- 编辑jmeter
- 搜索 : “${HEAP:=”-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"}"
- 改变初始堆内存和最大堆内存
(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)
- 修改agent服务器,指定agent机器的IP
- 修改jmeter-server文件
# vi jmeter-server - 修改RMI_HOST_DEF=-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx(需要连接的IP)
- 修改server服务器,指定server机器的IP
- 修改jmeter.bat文件
- 新增set rmi_host=-Djava.rmi.server.hostname=10.120.11.214
- 修改set ARGS=%DUMP% %HEAP% %NEW% %SURVIVOR% %TENURING% %PERM% %DDRAW% %rmi_host%
(6) 工具安装
解决方案
- 确定在controller机器上安装jdk,版本和jmeter一致,配置环境变量:Java_home等
- 在Agent机器上安装jdk,配置环境变量:Java_home和JMeter_home
- 安装目录不要带空格,最好都是简短的英文路径
(7) 压测文件
解决方案
- master机器启动后会拷贝jmx文件到slave机器,所以不需要在每台slave机器上也上传一份jmx,只需要在master机器上上传一份jmx脚本即可
总样本数 = 线程数 * 循环次数 * 执行机总数 - 如果使用csv进行参数化,则需要把参数文件在每台slave上拷一份且路径需要设置成一样的
(8) 连接失败
解决方案
按照以下步骤进行排查:
- jmeter-server是否启动
- 是否联网
- ping 服务器IP是否畅通
- telnet 端口 192.168.3.10 1099
- 检查服务器的防火墙是否关闭
- 阿里云安全策略是否正常
(9) could not find ApacheJmeter_core.jar
解决方案
在Agent机器安装jdk,并设置环境变量
(10) Bad call to remote host
解决方案
检查被控制机器上的jmeter-server有没有启动,或者remote_hosts的配置是否正确
|