Нужна помощь с распределённым тестированием в Jmeter

Хочу выполнить распределенную нагрузку. Помогите пожалуйста настроить связь Клиента и Сервера Jmeter.

Мои шаги:

  1. добавил в jmeter.properties строку remote_hosts=<IPv4-адрес_клиента>,<IPv4-адрес_сервера>
  2. создал переменную JAVA_HOME, присвоил ей значение - каталог с JDK
  3. создал переменную JMETER_HOME, аналогично присвоил значение - каталог с
    Jmeter
  4. добавил в значение переменной окружения Path строку: %JAVA_HOME%bin и %JMETER_HOME%bin
  5. На сервере запускаю rmiregistry.exe, затем jmeter_server.bat

Результат:

2015/01/29 12:27:37 FATAL - jmeter.JMeter: An error occurred:  java.rmi.RemoteException: Cannot start. See server log file.; nested exception is: 
	java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
	java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
	java.lang.ClassNotFoundException: org.apache.jmeter.engine.RemoteJMeterEngineImpl_Stub
	at org.apache.jmeter.engine.RemoteJMeterEngineImpl.init(RemoteJMeterEngineImpl.java:129)
	at org.apache.jmeter.engine.RemoteJMeterEngineImpl.startServer(RemoteJMeterEngineImpl.java:82)
	at org.apache.jmeter.JMeter.start(JMeter.java:363)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.jmeter.NewDriver.main(NewDriver.java:259)
Caused by: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
	java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
	java.lang.ClassNotFoundException: org.apache.jmeter.engine.RemoteJMeterEngineImpl_Stub
	at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:420)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:268)
	at sun.rmi.transport.Transport$1.run(Transport.java:200)
	at sun.rmi.transport.Transport$1.run(Transport.java:197)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$240(TCPTransport.java:683)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$1/2105227796.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
	at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Unknown Source)
	at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
	at sun.rmi.server.UnicastRef.invoke(Unknown Source)
	at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
	at org.apache.jmeter.engine.RemoteJMeterEngineImpl.init(RemoteJMeterEngineImpl.java:124)
	... 7 more
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
	java.lang.ClassNotFoundException: org.apache.jmeter.engine.RemoteJMeterEngineImpl_Stub
	at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
	at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:410)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:268)
	at sun.rmi.transport.Transport$1.run(Transport.java:200)
	at sun.rmi.transport.Transport$1.run(Transport.java:197)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
	at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$240(TCPTransport.java:683)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$1/2105227796.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.ClassNotFoundException: org.apache.jmeter.engine.RemoteJMeterEngineImpl_Stub
	at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
	at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.rmi.server.LoaderHandler$Loader.loadClass(LoaderHandler.java:1207)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:344)
	at sun.rmi.server.LoaderHandler.loadClassForName(LoaderHandler.java:1221)
	at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:453)
	at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:186)
	at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:637)
	at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:264)
	at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:214)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
	... 16 more

Как только не пробовал запускать, прописывал разные пути и т.д. Одно время даже не было ошибки на сервере, но была ошибка на клиенте:

Error initialising remote server: 192.168.56.***; 
nested exception is: java.net.ConnectException: Connection timed out: connect

Я уже все переискал, может кто-то сталкивался? Буду очень благодарен за помощь.

А где разворачиваете нагружающий энвайрмент? Например для Амазона свои ньюансы. Если в корпоративной сети, то Клиент и сервера должны находится в одной подсети.
Порт, по которому работает джметер тоже должен быть открыт.

А вообще, как то тоже бился с проблемой связи мастера со слейвами. В итоге решил, но результаты были не очень адекватными…

Поэтому решил просто одновременно запускать один и тот же тест план на нескольких нодах (вручную). С включенной записью лога в файл -l testresults.jtl (запускал естевственно в нон гуи режиме). Затем результаты качаем себе на локальную машину и открываем у себя в нужном листенере. Есть возможность открыть в одном и том же листенере несколько файлов с логами. Джметер их автоматически смержит в этом случае. Т.е. мы получим то же самое, что бы получили и при распределенной нагрузке. Тут только один ньюанс: время на нагружающих нодах должно совпадать

1 лайк

Спасибо за обратную связь. Да, клиент и сервер находятся в одной подсети. Если я правильно понял, скорей всего проблема с портом.
Команда netstat -ano выдаёт TCP 192.168.56.1:56825 192.168.56.1:1099 TIME_WAIT 0
1099 - используется rmiregistry.
Попробую еще поковыряться, если не получится использую Ваш вариант.

Я только начинаю разбираюсь с jmeter и еще не силен в non gui режиме. Получается, я должен задать одинаковое время начала теста в non gui для всех нод или можно просто enter одновременно нажать? :laughing:

Одинаковое время должно быть установлено именно на машинах (компах), на которых Вы будете запускать тестплан (то ,что на винде отображается справа внизу на панели задач).

На счёт нон гуи режима: он использует гораздо меньше системных ресурсов. Поэтому его предпочтительно использовать, если нагрузка должна быть большой.

Вот несколько полезных ссылок по теме:

BlazeMeter University | Blazemeter by Perforce
Blog | Blazemeter by Perforce

1 лайк

Доброе время суток,
есть вопрос по смежной теме, потому новую создавать не решился)
итого:
есть 2 виртуальные машины, на них одинаковая ось, они в одной подсети, соответственно одна сервер, вторая-клиент
поставил на обе одинаковую версию jmeter, добавил в системные переменные, все ок, на клиентской машине в пропертях прописал хост машины-сервера.
на машине-сервере запускаю jmeter-server.bat, то же самое делаю на клиенте, далее стартую гуй на клиенте, открываю сценарий, Run> Remote start > Server IP. до этого момента все гуд.
на стороне сервера в консоли jmeter-server появляеться сообщение что тест стартонул (то есть конфиги коннекшина прописаны правильно).
в отчете о прохождении теста на клиненсткой машине появляеться следующее : все степы в сценарии валяться с ошибкой “Response message: Non HTTP response message: Connection to http://google.com refused”
*google com, так как тесты идет в гугл и чтото ищет, если изменить хост то его тоже не открывает
подскажите плиз где проблема

вопрос снят, проблема была в прокси, jmeter ломиться в мир по дефолтному GateWay, нужно продублировать системные настройки прокси…но это узнаеться лишь после полудня расследований)