在压测需求较大并发量时,如1000以上,但是单台客户端难以实现,因此需要多台客户端并行,并且能同步控制
jmeter的分布式控制
- 客户端机器作为一个控制器controller,控制多台slave机器的操作
- controller通过GUI界面启动slave机器,将jmeter压测发送给每台启动的slave
- slave获得脚本后开始执行,slave本地不需预先存储脚本
- 各台slave执行完成后,将结果传回给controller,controller收集整合显示
远程服务器(slave)配置
远程服务器(slave)需要安装jmeter和jdk,最好与客户端(controller)保持相同版本
在远程服务器(slave)的jmeter的bin目录下执行jmeter-server.bat
文件
执行后:
Could not find ApacheJmeter_core.jar...
...Trying JMETER_HOME=..
将JMETER_HOME
添加到环境变量中,依旧有此提示
客户端(controller)配置
在客户端上要保证执行命令能发送到服务器,因此需配置客户端远程的ip地址和port
在客户端jmeter安装目录的bin目录下,修改配置文件 jmeter.properties
默认的remote_hosts
的值:
修改remote_hosts
的值:
# Remote Hosts - comma delimited
remote_hosts=127.0.0.1,172.18.152.16,172.18.152.12,172.16.43.80
#remote_hosts=localhost:1099,localhost:2010
即添加172.18.152.16,172.18.152.12,172.16.43.80
三个远程服务器
若不添加端口即为默认的1029端口
完成配置后打开客户端jmeter的GUI界面,运行->远程启动即可看到配置的远程服务器IP
可选择其中一个远程服务器执行或者所有远程服务器同步执行
先选择其中一个服务器实验一下,执行后远程服务器日志:
但是执行结束后客户端并没有任何的响应,查看客户端的log
2017/01/17 21:54:23 ERROR - jmeter.samplers.RemoteTestListenerWrapper: java.rmi.ConnectIOException: Exception creating connection to: 169.254.80.80; nested exception is:
java.net.SocketException: Network is unreachable: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
at com.sun.proxy.$Proxy1.testEnded(Unknown Source)
at org.apache.jmeter.samplers.RemoteTestListenerWrapper.testEnded(RemoteTestListenerWrapper.java:79)
at org.apache.jmeter.engine.StandardJMeterEngine.notifyTestListenersOfEnd(StandardJMeterEngine.java:218)
at org.apache.jmeter.engine.StandardJMeterEngine.run(StandardJMeterEngine.java:437)
at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: Network is unreachable: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
... 11 more
尝试后解决不了此问题
换一台机器做为客户端,同样的配置过程,运行后发现,OK!
刚刚执行的是试验脚本,接下来执行测试脚本,看是否OK!执行后发现并没有任何的执行结果,发现
依赖的地址是绝对路径,应将路径改为相对路径
将该.csv文件放在客户端jmeter的bin目录下,将依赖Filename改为相对路径 userInfo.cvs
,开始修改的时候,以为相对路径为 %JMETER_HOME%bin/userInfo.cvs
,并配置了JMETER_HOME
环境变量发现仍会出现问题,故使用相对路径 userInfo.cvs
!
配置好后,将userInfo.cvs
文件同样放在服务端肉机的Jmeter的bin目录下即可
这样发现如果每个肉鸡都要不同的userInfo.cvs
文件时,就特别麻烦,得往每台肉鸡拷不同的文件
如果在云端搭建一个服务器,每台肉鸡启动 jmeter-server
服务连接云端服务器,肉鸡向云端服务器上报本地IP和MAC地址,主机通过给云端服务器给每台肉鸡分别发送文件,这样极大提高效率