35

我必须使用 JMeter 进行分布式测试。目标是让一台本地服务器控制的 AWS 中的多个远程服务器向 AWS 中的另一台服务器发送文件下载请求。

如何在 AWS 中设置不同的服务器?
如何远程连接到他们?

有人可以提供一些有关如何操作的分步说明吗?
我尝试了几件事,但一直遇到跨网络的连接问题。

4

3 回答 3

62

我们有一个类似的任务,我们也遇到了很多问题。以下是整个过程的详细信息以及我们为解决遇到的问题所做的工作。希望能帮助到你。

我们需要从位于世界不同地区的 5 台服务器发送请求。因此,我们在 AWS 中启动了 5 个微型实例,每个实例位于不同的区域。我们选择的区域在地理上尽可能地分开。

远程(服务器)JMeters 配置

以下是我们如何设置每个实例。

  1. 安装的java:

    $ sudo apt-get update
    $ sudo apt-get install default-jre 
    
  2. 安装的JMeter:

    $ mkdir jmeter
    $ cd jmeter;
    $ wget ftp://apache.mirrors.pair.com//jmeter/binaries/apache-jmeter-2.9.tgz
    $ gunzip apache-jmeter-2.9.tgz;tar xvf apache-jmeter-2.9.tar
    
  3. 编辑JMeter 安装jmeter.properties文件/bin夹中的文件并取消注释包含该server.rmi.localport设置的行。我们将端口更改为 50000。

    server.rmi.localport=50000
    
  4. 启动 JMeter 服务器。确保服务器报告监听的地址和端口是正确的。

    $ cd ~/jmeter/apache-jmeter-2.9/bin
    $ vi jmeter-server
    

本地(客户端)JMeter 配置

然后我们设置 JMeter 以在本地客户端机器上的这些实例上远程运行测试:

  • 确保使用与服务器上运行的相同版本的 JMeter。如上所述安装 Java 和 JMeter。
  • jmeter.properties通过编辑可以在binJMeter 安装文件夹中找到的文件启用远程测试。该参数remote_hosts需要使用我们连接的远程服务器的公共 DNS 进行设置。
  • remote_hosts=54.x.x.x,54.x.x.x,54.x.x.x,54.x.x.x,54.x.x.x

我们现在能够告诉我们的客户端 JMeter 实例在我们指定的任何或所有远程服务器上运行测试。

问题和决议

以下是我们遇到的问题以及我们如何解决这些问题:

  1. 客户端失败:

    错误 - jmeter.engine.ClientJMeterEngine:java.rmi.ConnectException:连接 - 拒绝主机:127.0.0.1

    这是因为服务器主机由于 Amazon NAT 而返回私有 IP 地址作为其地址。我们通过设置脚本在启动服务器时包含的参数RMI_HOST_DEF来解决此问题:/usr/local/jmeter/bin/jmeter-server

    RMI_HOST_DEF=-Djava.rmi.server.hostname=54.xx.xx.xx
    

    现在,AWS 实例返回了服务器的外部 IP,我们可以开始测试了。

  2. 当服务器节点尝试返回结果并尝试连接客户端时,服务器尝试连接到我本地机器的外部 IP 地址。但它抛出了一个连接被拒绝的错误:

    2013/05/16 12:23:37 错误 - jmeter.samplers.RemoteListenerWrapper: testStarted(host) java.rmi.ConnectException: Connection denied to host: xxx.xxx.xxx.xx;

    我们通过在客户端设置反向隧道解决了这个问题。

    • 首先,我们编辑了JMeter 安装jmeter.properties文件/bin夹中的文件,并取消了包含该client.rmi.localport设置的行的注释。我们将端口更改为 60000:

      client.rmi.localport=60000
      
    • 然后我们使用 SSH 连接到每个服务器,并在客户端上设置一个反向隧道到端口 60000。

      $ ssh -i ~/.ssh/54-x-x-x.us-east.pem -R 60000:localhost:60000 ubuntu@54.x.x.x
      

    我们保持这些会话中的每一个都是打开的,因为 JMeter 服务器需要能够将测试结果传递给客户端。

    • 然后我们在客户端设置JVM_ARGS环境变量,在jmeter.sh文件/bin夹中的文件中:

      export JVM_ARGS="-Djava.rmi.server.hostname=localhost"
      

    通过这样做,JMeter 将告诉服务器连接以localhost:60000提供结果。这最终被隧道化回客户端。

  3. 在闲置一段时间后,与服务器的 SSH 连接不断下降。为了防止这种情况发生,我们在每个 SSH 隧道设置中添加了一个参数,指示客户端在向服务器发送空数据包之前等待 60 秒以保持连接处于活动状态:

    $ ssh -i ~/.ssh/54-x-x-x.us-east.pem -o ServerAliveInterval=60 -R 60000:localhost:60000 ubuntu@54.x.x.x
    

.ssh/config所有必需的 SSH 设置的版本:

 Host 54.x.x.x
   HostName 54.x.x.x
   Port 22
   User ubuntu
   ServerAliveInterval 60
   RemoteForward 127.0.0.1:60000 127.0.0.1:60000
   IdentityFile  ~/.ssh/54-x-x-x.us-east.pem
   IdentitiesOnly yes

ssh 54.x.x.x设置好后使用。)

于 2013-05-17T23:09:26.740 回答
5

我刚刚在 openstack 上查看了这个并发现了同样的问题......不知道为什么 jmeter 远程处理文档只涵盖了所需步骤的一半。您可以在没有隧道或接触属性文件的情况下完成此操作。

你需要

  • 所有节点都公布其公共 IP - 在 AWS/OS 上,这默认为私有 IP
  • RMI 端口的入口规则,默认为 1099 - 我使用这个
  • RMI “本地”端口的入口规则,默认为动态。下面我将 4001 用于客户端,4000 用于服务器。端口可以​​相同,但请注意属性不同。

如果您使用工作站作为客户端,您可能仍需要隧道。在Archana Aggarwal上方有很好的隧道提示。

远程服务器

设置java.rmi.server.hostnameserver.rmi.localport内联或在属性文件中。

jmeter-server -Djava.rmi.server.hostname=publicip -Dserver.rmi.localport=4000

客户端上的偷偷摸摸的服务器

您也可以在与客户端相同的机器上运行一个。为清楚起见,我已设置java.rmi.server.hostname但保留server.rmi.localport为动态

jmeter-server -Djava.rmi.server.hostname=localip

客户

设置java.rmi.server.hostnameclient.rmi.localport内联或在属性文件中。像这样使用-R等:

jmeter -n -t Test.jmx -Rremotepublicip1,remotepublicip2 -Djava.rmi.server.hostname=clientpublicip -Dclient.rmi.localport=4001 -GmypropA=1 -GmypropB=2 -lresults.jtl
于 2015-08-27T21:59:12.520 回答
1

当您在 AWS 中使用 JMeter 进行分布式测试时,我建议您使用 docker - 这将帮助我们非常快速地使用 jmeter 测试基础设施。这样我们还可以确保在所有亚马逊实例中安装相同版本的 java 和 jmeter,这对 JMeter 分布式测试非常重要。

确保 - 您为 jmeter-server 设置了以下属性和端口。[它们不一定是 1099,50000]

server.rmi.localport=50000
server_port=1099
java.rmi.server.hostname=SERVER_IP

为客户

client.rmi.localport=60000

在此处输入图像描述

java.rmi.server.hostname=SERVER_IP - 这一步非常重要,因为 aws 实例中的容器将在 docker 网络中拥有自己的 IP 地址 - 因此主从无法通信。所以我们显式设置了这个属性

更多信息:

http://www.testautomationguru.com/jmeter-distributed-load-testing-using-docker-in-aws/

于 2016-11-16T02:44:46.600 回答