Тестирование распределенной нагрузки на aws с помощью jmeter

Я пытаюсь настроить aws ec2-машины для нагрузочного тестирования моего веб-сервера с помощью jmeter, но я застрял. У меня есть jmeter-клиент на моей локальной машине, и я хочу настроить несколько узлов jmeter-сервера на ec2, чтобы выполнить нагрузочное тестирование, и до сих пор я пытаюсь запустить один сервер node. Но пока это не сработало.

У меня есть тот же jmeter, запущенный на моем локальном компьютере, и сервер, и версия java была немного иной, но я не думаю, что это проблема. У большинства людей были проблемы с получением правильного ip для соединения между клиентом и узлами сервера, но после многочисленных поисков я прошел через все эти проблемы. Я застрял, когда сервер node пытается вернуть результат и пытается подключиться к клиенту, моей локальной машине. Сервер пытается подключиться к внешнему 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

Ответ 1

Ну, я, наконец, решил проблему. Я закончил использовать ssh обратные туннели. Я не уверен, что есть лучший способ сделать это. Итак, если у кого-то есть аналогичная проблема, вот как я это сделал:

  • Создайте обратный туннель ssh с сервера на клиент. Итак, на стороне клиента:

    ssh -Nf -R [client.rmi.localport]:localhost:[client.rmi.localport on serverside] [email protected]

  • запустить сервер и иметь client.rmi.localport; порт, в котором был создан туннель;

  • запустите клиент как: ./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-туннеля:

ssh -L 55501:127.0.0.1:55501 -L 55511:127.0.0.1:55511 -R 55512:127.0.0.1:55512 [email protected]

4.Edit jmeter-server script, чтобы запустить jmeter.sh

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

5. Теперь запустите на сервере:

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

6. И на клиентском запуске jmeter с gui или add -n, если gui не требуется:

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 client) в экземпляр EC2 тоже.

По JMeter Distributed Testing Шаг за шагом:

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

Для распределенного тестирования для работы системы должны находиться в одной и той же подсети, иначе RMI не сможет подключиться. Похоже, что ваш случай: jmeter-slaves находятся в одной подсети (EC2) и jmeter-master в другой (ваша локальная рабочая станция).

Ответ 4

Я написал бесплатный с открытым исходным кодом script, чтобы сделать именно это. Я прошел через те же проблемы, которые были перечислены OP, и, хотя в итоге я все-таки работал, он никогда не был замечательным, и я хотел, чтобы что-то автоматизировало из-за проблем.