在AWS中为具有连接问题的分布式测试设置JMeter

nul*_*ull 32 jmeter amazon-web-services

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

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

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

Arc*_*wal 58

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

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

远程(服务器)JMeters配置

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

  1. 安装java:

    $ sudo apt-get update
    $ sudo apt-get install default-jre 
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 编辑JMeter安装文件夹jmeter.properties中的/bin文件,并取消注释包含该server.rmi.localport设置的行.我们将端口更改为50000.

    server.rmi.localport=50000
    
    Run Code Online (Sandbox Code Playgroud)
  4. 启动JMeter服务器.确保服务器报告的地址和端口正确无误.

    $ cd ~/jmeter/apache-jmeter-2.9/bin
    $ vi jmeter-server
    
    Run Code Online (Sandbox Code Playgroud)

本地(客户端)JMeter配置

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

  • 确保使用与在服务器上运行的JMeter相同版本.如上所述安装Java和JMeter.
  • 通过编辑jmeter.propertiesbin在JMeter安装文件夹中找到的文件启用远程测试.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:Connection - 拒绝主机: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
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    2013/05/16 12:23:37错误 - jmeter.samplers.RemoteListenerWrapper:testStarted(host)java.rmi.ConnectException:连接拒绝主机:xxx.xxx.xxx.xx;

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

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

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

      $ ssh -i ~/.ssh/54-x-x-x.us-east.pem -R 60000:localhost:60000 ubuntu@54.x.x.x
      
      Run Code Online (Sandbox Code Playgroud)

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

    通过这样做,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
    
    Run Code Online (Sandbox Code Playgroud)

(.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
Run Code Online (Sandbox Code Playgroud)

只需ssh 54.x.x.x在设置之后使用.)


KCD*_*KCD 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
Run Code Online (Sandbox Code Playgroud)

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

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

jmeter-server -Djava.rmi.server.hostname=localip
Run Code Online (Sandbox Code Playgroud)

客户

设置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
Run Code Online (Sandbox Code Playgroud)