使用jmeter在aws上进行分布式负载测试

时间:2013-01-29 19:12:03

标签: amazon-ec2 jmeter firewall load-testing connection-timeout

我一直在尝试使用jmeter设置aws ec2机器以对我的Web服务器进行负载测试但是我被卡住了。我在我的本地机器上有一个jmeter客户端,我想在ec2上设置多个jmeter-server节点来进行负载测试,到目前为止,我只是想让一个服务器节点启动并运行。但它对我来说还没有成功。

我在我的本地机器上运行相同的jmeter,服务器和java版本有点不同,但我不认为这是问题所在。大多数人在获取正确的ip以便在客户端和服务器节点之间进行连接时遇到了问题,但经过大量搜索后,我已经解决了所有这些问题。当服务器节点尝试返回结果并尝试连接到客户端(我的本地计算机)时,我陷入困境。服务器尝试连接到本地计算机的外部IP地址。但是它会抛出连接拒绝错误,这显然是由连接超时引起的。我想这是一些防火墙问题,但我尝试关闭我的本地机器上的防火墙,但它仍然会抛出相同的错误。我不知道我怎么能超越这个,它应该花费太多时间。

有人可以建议我解决这个问题吗?谢谢!

  • 我的本地计算机是Mac OS X 10.7.5,我的服务器节点在ubuntu上。

这是它抛出的错误:

2013/01/29 12:23:37 ERROR - jmeter.samplers.RemoteListenerWrapper: testStarted(host) java.rmi.ConnectException: Connection refused to host: xxx.xxx.xxx.10; nested exception is: 
java.net.ConnectException: Connection refused
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:128)
at org.apache.jmeter.samplers.RemoteSampleListenerImpl_Stub.testStarted(Unknown Source)
at org.apache.jmeter.samplers.RemoteListenerWrapper.testStarted(RemoteListenerWrapper.java:83)
at org.apache.jmeter.engine.StandardJMeterEngine.notifyTestListenersOfStart(StandardJMeterEngine.java:226)
at org.apache.jmeter.engine.StandardJMeterEngine.run(StandardJMeterEngine.java:349)
at java.lang.Thread.run(Thread.java:636)
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:327)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:193)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:180)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:384)
at java.net.Socket.connect(Socket.java:546)
at java.net.Socket.connect(Socket.java:495)
at java.net.Socket.<init>(Socket.java:392)
at java.net.Socket.<init>(Socket.java:206)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:146)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
... 8 more

4 个答案:

答案 0 :(得分:8)

好吧,我终于解决了这个问题。我最终使用ssh反向隧道。我不确定是否有更好的方法来做到这一点。所以,如果有人遇到类似的问题,我就这样做了:

  1. 从服务器到客户端创建反向ssh隧道。所以,在客户端:

    ssh -Nf -R [client.rmi.localport]:localhost:[client.rmi.localport on serverside] user@server

  2. 启动服务器并拥有client.rmi.localport;创建隧道的端口;

  3. ./bin/jmeter-server -Djava.rmi.server.hostname=127.0.0.1启动客户端。

  4. 就是这样!您已准备好分布式测试。

答案 1 :(得分:3)

在Linux / OSX上对我有用的解决方案:

1.在客户端编辑 bin / jmeter.properties 并添加:

remote_hosts=127.0.0.1:55501
client.rmi.localport=55512
mode=Batch
num_sample_threshold=250

2.在服务器上编辑 bin / jmeter.properties 并添加:

server_port=55501
server.rmi.localhostname=127.0.0.1
server.rmi.localport=55511

3.现在使用此ssh tunel连接到服务器:

ssh -L 55501:127.0.0.1:55501 -L 55511:127.0.0.1:55511 -R 55512:127.0.0.1:55512 user@hostname

4.编辑jmeter-server脚本以启动jmeter.sh

${DIRNAME}/jmeter.sh ${RMI_HOST_DEF} -Dserver_port=${SERVER_PORT:-1099} -s -j jmeter-server.log "$@"  

5.现在在服务器上运行:

bin/jmeter-server -Djava.rmi.server.hostname=127.0.0.1

6.在客户端运行带有gui的jmeter或如果不需要gui则添加-n:

bin/jmeter.sh -Djava.rmi.server.hostname=127.0.0.1

或者,测试计划:

bin/jmeter.sh -Djava.rmi.server.hostname=127.0.0.1 -t /path/to/test-plan.jmx

答案 2 :(得分:0)

看起来你必须将你的jmeter-master实例(jmeter客户端)移动到EC2实例。

根据JMeter Distributed Testing Step-by-step

2. check all the clients are on the same subnet;

要使分布式测试正常工作,系统必须位于同一子网上,否则RMI将无法连接 看起来像你的情况:jmeter-slaves在一个子网(EC2)和jmeter-master在另一个子网(你的本地工作站)。

答案 3 :(得分:0)

我写了一个免费的open source script来帮助做到这一点。我经历了OP列出的相同问题,即使我确实让事情最终有效,但它从来都不是很好,我想要一些东西来自动消除麻烦。