Profile performance of JMeter when running running as a remote server - jmeter

When running JMeter on my desktop, I can use VisualVM to monitor the characteristics of JMeter as I perform load tests.
JMeter VisualVM
However, when I set up JMeter on a remote server and have jstatd running, I do not see my application under that server. I can see jstatd running, with the following command:
root#jmeter:~# netstat -nlp | grep jstatd
tcp6 0 0 :::39337 :::* LISTEN 8410/jstatd
tcp6 0 0 :::1099 :::* LISTEN 8410/jstatd
Has anyone been successful in getting this set up? I can blindly increase the JVM properties, but I would like to see how my jmeter tests perform.

From jstatd description
Monitors Java Virtual Machines (JVMs) and enables remote monitoring tools to attach to JVMs. This command is experimental and unsupported.
I would suggest switching to the same "jvisualvm" approach, but connecting to JMeter instance remotely, not locally, as per Monitoring and Management Using JMX Technology guide.
Add the following lines to system.properties file (lives in JMeter's "bin" folder)
java.rmi.server.hostname=remote_machine_IP_here
com.sun.management.jmxremote.host=remote_machine_IP_here
com.sun.management.jmxremote.port=remote_machine_PORT_here
com.sun.management.jmxremote.rmi.portremote_machine_PORT_here
com.sun.management.jmxremote.authenticate=false
com.sun.management.jmxremote.local.only=false
com.sun.management.jmxremote.ssl=false
Restart JMeter to pick the properties up. (Alternative way of setting Java System properties is passing them via -D arguments to JMeter startup script like:
jmeter -Djava.rmi.server.hostname=10.10.10.10 .....
In jvisualvm -> Remote -> Add Remote Host put a connection string like:
remote_machine_IP:remote_machine_PORT
or
service:jmx:rmi:///jndi/rmi://remote_machine_IP:remote_machine_PORT/jmxrmi
Alternatively you can use PerfMon plugin which collects a way more detailed statistics and able to plot it via the relevant JMeter Listener. See How to Monitor Your Server Health & Performance During a JMeter Load Test guide for more details on setting up and using PerfMon with JMeter.

Try the steps mentioned here, using jstatd:
Remote Monitoring VisualVM using jstatd
As an alternative, you can try with JMX:
enable remote monitoring using JMX

Related

JMeter - Remote Testing on Linux

I am executing JMeter remote testing with 1 master machine (192.168.0.1) and with 7 slave machines with 3 VMs (192.168.0.2 to 192.168.0.4) on a network interface and 4 other VMs (192.168.0.5 to 192.168.0.8) are in a different network interface.
My JMeter script is located at Master machine - 192.168.0.1
I tried to execute my test with the following command
./jmeter -n -t /home/lup01/Document/LuP2021/ITonICE_Lasttest_InfluxDebug_09032021.jmx -l /home/lup01/Document/LuP2021/LuP2021_LastTest_001_14-10-2021_7VMs.jtl -R 192.168.100.2,192.168.100.3,192.168.100.4 -Djava.rmi.server.hostname=192.168.100.6,192.168.100.7,192.168.100.8,192.168.100.9
However, the test never started. the screen just hung and after 15 minutes i had to stop the test. I did the sample run only with 3 threads.
On course of debugging, i also checked that, when i executed the test with
./jmeter -n -t /home/lup01/Document/LuP2021/ITonICE_Lasttest_InfluxDebug_09032021.jmx -l /home/lup01/Document/LuP2021/LuP2021_LastTest_001_14-10-2021_7VMs.jtl -R 192.168.100.2,192.168.100.3,192.168.100.4
the test was running fine with 3 VMs which are on the same interface as the master machine
However, when i executed the 2nd part
./jmeter -n -t /home/lup01/Dokumente/LuP2021/ITonICE_Lasttest_InfluxDebug_09032021.jmx -l /home/lup01/Dokumente/LuP2021/LuP2021_LastTest_001_14-10-2021_7VMs.jtl -Djava.rmi.server.hostname=192.168.100.6,192.168.100.7,192.168.100.8,192.168.100.9
the test got executed but the load was generated only on the master machine (192.168.0.1). i validated this by printing the host name in the result file.
Can someone please guide me what changes i need to do to get the test running successfully and the load being generated at the slave machines 192.168.100.6 to 192.168.100.9?
JMeter Master machine doesn't generate any load, it only reads .jmx script, transfers it to slaves and collects results.
It doesn't make sense to run more than 1 JMeter process on 1 machine, it doesn't provide any benefit and just consumes resources, if you have only one machine - run a single JMeter process, just make sure to follow JMeter Best Practices and properly tune this JMeter instance for high throughput testing
If this is some form of an experiment and you have to run multiple JMeter processes on a single host and would like to bind different JMeter instances to different network interfaces - you can do it via "Advanced" tab of the HTTP Request sampler (or HTTP Request Defaults if you have more than one sampler) like it's described in Using IP Spoofing to Simulate Requests from Different IP Addresses with JMeter

How to create 8 instances with 500 users each using Non-GUI mode in Jmeter

I have a requirement to run 4000 users. I just wanted to run that using Non-GUI. How can we create 8 instances with 500 users each using Non-GUI mode in Jmeter. Suggest the possible scenario with an example.
Get 9 machines somewhere somehow
Install Java 8+ (it's the per-requisite to run JMeter 5.4)
Install JMeter onto all machines. If you plan to use JMeter Plugins make sure that all the plugins are installed on all machines
If your test depends on external files or libraries - make sure that all the libraries and/or files are copied to the JMeter Machines
If you plan to use secure communication between master and slaves follow Setting Up SSL JMeter Documentation chapter, if not - add the next line to user.properties files on all machines:
server.rmi.ssl.disable=true
Run jmeter-server on 8 machines which will be acting as slaves
Add the next line to user.properties on the master machine
remote_hosts=ip_address_of_slave1,ip_address_of_slave_2, etc.
Make sure that the machines are on the same subnet and there is no firewall blocking connections between them
Run your test as:
jmeter -r -n -t /path/to/your/test.jmx -l /path/to/results.jtl
When the test finishes analyze your results by using Listeners or generating HTML Reporting Dashboard
More information:
Remote Testing
How to Perform Distributed Testing in JMeter

What update is needed in jmeter.properties and jmeter-server files to create a JMeter Remote Load Test

I am using jmeter 5.4.1, and facing issue while setting up the whole environment for that.
I have firewall in between master and slave machines.
I can request for some ports to open but before that I want to know how to configure them?
What update is needed in jmeter.properties and jmeter-server files to create a JMeter Remote Load Test.
In jmeter.properties nothing, don't touch this file, perform all the configuration either in user.properties or via -J command-line arguments.
Coming back to your question, I believe the official documentation is quite comprehensive, however just in case you cannot or unwilling to read:
In the master:
remote_hosts=ip,addresses,or,dns,hostnames,of,slaves,separated,by,comma
client.rmi.localport=xxxx
In the slave(s):
client.rmi.localport=xxxx
server.rmi.localport=yyyy
If you don't want secure communication between master and slaves - add the next line to both as well:
server.rmi.ssl.disable=true
So in the firewall you need to open these xxxx and yyyy ports
More information:
Apache JMeter Distributed Testing Step-by-step
Remote hosts and RMI configuration
JMeter Distributed Testing with Docker

Unable to connect to remote machine in jmeter

I am trying to launch my jmeter tests in a remote machine as i will be running bulk users on a .jmx file (Approx 200 000 threads). I have a remote machine where i have downloaded jmeter and saved the folder in desktop. and in command prompt i have a command
Desktop\apache-jmeter-4.0\bin>jmeter-server -n
Could not find ApacheJmeter_core.jar ...
... Trying JMETER_HOME=..
Found ApacheJMeter_core.jar
Created remote object: <Have a message saying the server is up and running>
Now in jenkins i have a command
export JAVA_HOME=/java/1.8.0.65
bin//jmeter -n -R <Remote HOst IP> -t file.jmx -l result.jtl -e -o/resultfolder
When i trigger the job in jenkins i am getting
Configuring remote engine: <Remote machine IP>
Exception creating connection to: <Remote machine IP>; nested exception is:
java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)
Failed to configure <Remote machine IP>
Stopping remote engines
Remote engines have been stopped
Error in NonGUIDriver java.lang.RuntimeException: Following remote engines could not be configured:<Remote machine IP>
I have a rmi keystore file created in remote machine.
You need to launch create-rmi-keystore.sh script on all machines and make sure that the configuration is the same, this way communication between JMeter master and slaves will be secure.
More information: Remote Testing: Setting Up SSL
If you don't want the communication between the master and slaves to be secure - you can amend the command line to:
jmeter -Jserver.rmi.ssl.disable=true -n -R <Remote HOst IP> -t file.jmx -l result.jtl -e -o/resultfolder
or add the next line to user.properties file on all hosts to make the change permanent:
server.rmi.ssl.disable=true
JMeter restart will be required to pick the property up. See Configuring JMeter user manual chapter for more information.
Depending on your test nature 1 slave might be not enough to simulate 200k threads so make sure you're following recommendations from the 9 Easy Solutions for a JMeter Load Test “Out of Memory” Failure article and keeping an eye on JMeter engines health using built-in OS tools or JMeter PerfMon Plugin as if JMeter will not be able to send requests fast enough - you will get lower throughput/higher response times even if your application is not overloaded.

PerfMon plugin throwing error (with use of variables) in JMeter distributed Mode

I have implemented PerfMon Metrics Collector (listeners) in my JMeter scripts. These listeners have HOST and PORT fields. I have defined variables for these in Test Plan and using them in listeners.
I tested these scripts in non-distributed mode and it worked perfectly.
Now, I converted my scripts for distributed mode. Everything works fine except PerfMon listeners which throw following error message:
2016/02/29 09:06:35 ERROR - kg.apc.jmeter.perfmon.PerfMonCollector: Perfmon plugin error: java.net.ConnectException: connect: Address is invalid on local machine, or port is not valid on remote machine
This error seemed to be related to invalid value (may be these listeners do not handle special characters like {} $ in distributed mode!!). So, I removed variables for HOST/PORT and instead used hard coded values and it worked fine.
So apparently, these listeners do not work properly in distributed mode (IF used with variables).
Is there any workaround for this issue as I have plenty of PerfMon listeners in my setup and manually changing them all will be a tiresome job.
Go for JMeter Properties instead of JMeter Variables, like:
Substitute ${HOST} with ${__P(HOST,)}
Substitute ${PORT} with ${__P(PORT,)}
Pass HOST and PORT properties values on JMeter master side like:
jmeter -GHOST=target_hostname_or_IP -GPORT=target_port -s -n -t ....
You can have different values on different slaves, in that case specify properties in user.properties file (it's located under /bin folder of JMeter installation) like:
HOST=10.20.30.40
PORT=1234
Remember to restart JMeter after editing any configuration file.
References:
__P() function documentation
Full list of command-line options
Apache JMeter Properties Customization Guide

Resources