【问题标题】:distributed load testing on aws with jmeter使用 jmeter 在 aws 上进行分布式负载测试
【发布时间】:2015-08-19 04:34:48
【问题描述】:

我一直在尝试设置 aws ec2 机器以使用 jmeter 对我的 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

【问题讨论】:

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


    【解决方案1】:

    好吧,我终于解决了这个问题。我最终使用了 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

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

    【讨论】:

      【解决方案2】:

      在 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
      

      【讨论】:

        【解决方案3】:

        看起来您也必须将您的 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. 服务器在同一个子网中,如果使用 192.x.x.x 或 10.x.x.x ip 地址。如果服务器不使用 192 或 10 ip 地址,则不应该有任何问题。”而且我使用的是 107.x.x.x,所以如果我理解正确,这应该不是问题。服务器知道我本地工作站的外部 IP。我想知道我是否必须使用 ssh 反向隧道。
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-10
          • 1970-01-01
          • 2020-12-05
          • 1970-01-01
          相关资源
          最近更新 更多