0

I'm trying to implement Jmeter distributed framework with Docker.When I run server on slave machine it is throwing me the error:

docker run \
        -dit \
        -e HOST_IP=‘<MyHostIP>’ \
        -p 6000:6000 \
        -p 1099:1099 \
        -p 3000:3000 \
        -v "${volume_path}":${jmeter_path} \
        --rm \
        jmeter \
        -n -s \
        -Dclient.rmi.localport=3000 \
        -Dserver.rmi.localport=6000 \
        -Djava.rmi.server.hostname=MyHostIP \
        -Jserver.rmi.ssl.keystore.file=${jmeter_path}/rmi_keystore.jks \
        -j ${jmeter_path}/server/slave_${timestamp}.log

I'm getting following error on running above command

java.rmi.server.ExportException: Listen failed on port: 6000; nested exception is:
        java.io.IOException: Could not bind to /MY IP using port 6000
        at sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:348) ~[?:1.8.0_275]
        at sun.rmi.transport.tcp.TCPTransport.exportObject(TCPTransport.java:254) ~[?:1.8.0_275]
        at sun.rmi.transport.tcp.TCPEndpoint.exportObject(TCPEndpoint.java:412) ~[?:1.8.0_275]
        at sun.rmi.transport.LiveRef.exportObject(LiveRef.java:147) ~[?:1.8.0_275]
        at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:237) ~[?:1.8.0_275]
        at java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:383) ~[?:1.8.0_275]
        at java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:346) ~[?:1.8.0_275]
        at java.rmi.server.UnicastRemoteObject.<init>(UnicastRemoteObject.java:225) ~[?:1.8.0_275]
        at org.apache.jmeter.engine.RemoteJMeterEngineImpl.<init>(RemoteJMeterEngineImpl.java:66) ~[ApacheJMeter_core.jar:5.3]
        at org.apache.jmeter.engine.RemoteJMeterEngineImpl.startServer(RemoteJMeterEngineImpl.java:72) ~[ApacheJMeter_core.jar:5.3]
        at org.apache.jmeter.JMeter.start(JMeter.java:524) [ApacheJMeter_core.jar:5.3]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_275]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_275]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_275]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_275]
        at org.apache.jmeter.NewDriver.main(NewDriver.java:252) [ApacheJMeter.jar:5.3]
Caused by: java.io.IOException: Could not bind to /MY IP using port 6000
        at org.apache.jmeter.rmi.SSLRMIServerSocketFactory.createServerSocket(SSLRMIServerSocketFactory.java:138) ~[ApacheJMeter_core.jar:5.3]
        at sun.rmi.transport.tcp.TCPEndpoint.newServerSocket(TCPEndpoint.java:670) ~[?:1.8.0_275]
        at sun.rmi.transport.tcp.TCPTransport.listen(TCPTransport.java:335) ~[?:1.8.0_275]
        ... 15 more
Caused by: java.net.BindException: Address not available (Bind failed)
        at java.net.PlainSocketImpl.socketBind(Native Method) ~[?:1.8.0_275]

I've checked netstat,6000 port is nowhere used. And the port opening is also done for 1099,6000,3000.

I have built my image as per this blog. https://www.blazemeter.com/blog/jmeter-distributed-testing-with-docker I was able to build JMeter distributed within a single host. However, when I'm trying to do it on different hosts, it's throwing me errors.

Svp57
  • 308
  • 2
  • 13
  • My intuition is that you need to set `-Djava.rmi.server.hostname=0.0.0.0`; in Docker in general you need to set TCP listen addresses to 0.0.0.0 for them to be accessible from outside Docker, and you won't be able to set them to a host IP address. [How to access JMX interface in docker from outside?](https://stackoverflow.com/questions/31257968/how-to-access-jmx-interface-in-docker-from-outside) is pretty inconclusive though. – David Maze Nov 19 '21 at 12:14
  • @DavidMaze..I can run it with 0.0.0.0 but my Master server is not able to make a connection with client.Error in rconfigure() method java.rmi.ConnectException: Connection refused to host: 0.0.0.0; nested exception is: – Svp57 Nov 19 '21 at 16:08
  • 0.0.0.0 means "everywhere"; it makes sense to _listen_ to "everywhere" but not to make an outbound connection to it. If the primary server is on a different host then you'd use the worker container's host's DNS name or IP address, and the first `docker run -p ...:6000` port number. – David Maze Nov 19 '21 at 17:11

0 Answers0