Apache JMeter Cheatsheet¶
Installation¶
| Platform | Command |
|---|---|
| Ubuntu/Debian | sudo apt update && sudo apt install jmeter |
| Ubuntu (Snap) | sudo snap install jmeter |
| macOS (Homebrew) | brew install jmeter |
| Windows (Chocolatey) | choco install jmeter |
| Binary (Linux/macOS) | wget https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.3.tgz && tar -xzf apache-jmeter-5.6.3.tgz |
| Docker | docker pull justb4/jmeter:latest |
| Prerequisites | Java JDK 8+ required: java -version |
Post-Installation Setup¶
# Add JMeter to PATH (Linux/macOS)
export JMETER_HOME=/opt/apache-jmeter-5.6.3
export PATH=$PATH:$JMETER_HOME/bin
# Verify installation
jmeter --version
# Increase heap size (add to ~/.bashrc or jmeter startup script)
export JVM_ARGS="-Xms1g -Xmx4g"
Basic Commands¶
| Command | Description |
|---|---|
jmeter |
Launch JMeter GUI |
jmeter -t test-plan.jmx |
Open specific test plan in GUI |
jmeter -n -t test.jmx -l results.jtl |
Run test in non-GUI mode with results |
jmeter -n -t test.jmx -l results.jtl -e -o report/ |
Run test and generate HTML dashboard |
jmeter --version or jmeter -v |
Display JMeter version |
jmeter --help or jmeter -h |
Show help and available options |
jmeter -? |
List all available properties |
jmeter -n -t test.jmx -j jmeter.log |
Run test with custom log file |
jmeter -g results.jtl -o dashboard/ |
Generate HTML report from existing results |
jmeter -p custom.properties |
Launch with custom properties file |
jmeter -Xmx4g |
Launch with increased heap size (4GB) |
jmeter-server |
Start JMeter in server mode for distributed testing |
jmeter -n -t test.jmx -l results.csv |
Run test and save results as CSV |
jmeter -n -t test.jmx -l results.xml |
Run test and save results as XML |
jmeter -Jusers=100 |
Override property value at runtime |
Advanced Usage¶
| Command | Description |
|---|---|
jmeter -n -t test.jmx -r |
Run test on all remote servers |
jmeter -n -t test.jmx -R server1:1099,server2:1099 |
Run test on specific remote servers |
jmeter -n -t test.jmx -Gusers=100 -Grampup=60 |
Set global properties for remote servers |
jmeter -n -t test.jmx -r -X |
Run distributed test and exit remote servers after |
jmeter -n -t test.jmx -q env.properties -q users.properties |
Use multiple property files |
jmeter -H proxy.example.com -P 8080 |
Run with HTTP proxy |
jmeter -H proxy.com -P 8080 -u username -a password |
Run with authenticated proxy |
jmeter -Lorg.apache.jmeter=DEBUG |
Set log level to DEBUG |
jmeter -Lorg.apache.jmeter.protocol.http=DEBUG |
Set log level for specific package |
jmeter-server -Djava.rmi.server.hostname=192.168.1.100 |
Start server with specific hostname |
jmeter-server -Dserver_port=1099 |
Start server on custom port |
jmeter -n -t test.jmx -Jsummariser.interval=30 |
Set summary interval to 30 seconds |
jmeter -n -t test.jmx -Jjmeter.save.saveservice.output_format=xml |
Force XML output format |
jmeter -n -t test.jmx -Jjmeter.save.saveservice.response_data=true |
Include response data in results |
jmeter -XX:+UseG1GC -n -t test.jmx |
Run with G1 garbage collector |
jmeter -Dcom.sun.management.jmxremote -n -t test.jmx |
Enable JMX monitoring |
jmeter -Dhttp.keepAlive=false -n -t test.jmx |
Disable HTTP keep-alive |
jmeter -g results.jtl -o dashboard/ -f |
Force overwrite existing dashboard |
jmeter -N "localhost|*.internal.com" |
Set non-proxy hosts |
PluginsManagerCMD.sh install jpgc-casutg,jpgc-synthesis |
Install JMeter plugins via CLI |
Configuration¶
JMeter Properties File (jmeter.properties)¶
# Thread and ramp-up settings
jmeter.threads=100
jmeter.rampup=60
# Remote server configuration
remote_hosts=server1:1099,server2:1099,server3:1099
# Result file configuration
jmeter.save.saveservice.output_format=csv
jmeter.save.saveservice.response_data=false
jmeter.save.saveservice.samplerData=false
jmeter.save.saveservice.requestHeaders=false
jmeter.save.saveservice.url=true
jmeter.save.saveservice.responseHeaders=false
# HTTP settings
httpclient.reset_state_on_thread_group_iteration=true
http.keepAlive=true
http.connection.timeout=30000
http.socket.timeout=120000
# Summariser interval (seconds)
summariser.interval=30
# Log level
log_level.jmeter=INFO
log_level.jmeter.engine=DEBUG
User Properties File (user.properties)¶
# Custom variables
baseurl=https://example.com
users=100
rampup=60
duration=300
# Environment-specific settings
env=production
api_key=your_api_key_here
System Properties¶
# Set system properties via command line
jmeter -Dhttp.proxyHost=proxy.example.com \
-Dhttp.proxyPort=8080 \
-Dhttps.proxyHost=proxy.example.com \
-Dhttps.proxyPort=8080 \
-n -t test.jmx
JVM Configuration (jmeter script)¶
# Edit JMETER_HOME/bin/jmeter or set environment variable
export HEAP="-Xms1g -Xmx4g -XX:MaxMetaspaceSize=256m"
export GC_ALGO="-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1ReservePercent=20"
export JVM_ARGS="$HEAP $GC_ALGO"
Distributed Testing Configuration¶
# In jmeter.properties on controller machine
remote_hosts=192.168.1.101:1099,192.168.1.102:1099,192.168.1.103:1099
# Server RMI configuration
server.rmi.ssl.disable=true
server.rmi.localport=4000
server_port=1099
# On remote server machines
java.rmi.server.hostname=192.168.1.101
Common Use Cases¶
Use Case 1: Basic Load Test with HTML Report¶
# Run load test with 100 users, 60s ramp-up, generate HTML report
jmeter -n -t load-test.jmx \
-Jusers=100 \
-Jrampup=60 \
-Jduration=300 \
-l results/results.jtl \
-e -o results/dashboard/ \
-j results/jmeter.log
# View the report
open results/dashboard/index.html # macOS
xdg-open results/dashboard/index.html # Linux
Use Case 2: Distributed Load Test Across Multiple Servers¶
# Step 1: Start JMeter servers on remote machines
# On server1 (192.168.1.101):
jmeter-server -Djava.rmi.server.hostname=192.168.1.101
# On server2 (192.168.1.102):
jmeter-server -Djava.rmi.server.hostname=192.168.1.102
# Step 2: Run distributed test from controller
jmeter -n -t distributed-test.jmx \
-R 192.168.1.101:1099,192.168.1.102:1099 \
-Gusers=500 \
-Grampup=120 \
-l distributed-results.jtl \
-e -o distributed-report/
# Step 3: Shutdown remote servers
jmeter -n -t distributed-test.jmx -R 192.168.1.101:1099,192.168.1.102:1099 -X
Use Case 3: API Performance Testing with Multiple Environments¶
# Create environment-specific property files
# dev.properties:
echo "baseurl=https://dev-api.example.com" > dev.properties
echo "api_key=dev_key_123" >> dev.properties
# prod.properties:
echo "baseurl=https://api.example.com" > prod.properties
echo "api_key=prod_key_456" >> prod.properties
# Run test against dev environment
jmeter -n -t api-test.jmx \
-q dev.properties \
-Jusers=50 \
-l dev-results.jtl \
-e -o dev-report/
# Run test against production environment
jmeter -n -t api-test.jmx \
-q prod.properties \
-Jusers=200 \
-l prod-results.jtl \
-e -o prod-report/
Use Case 4: CI/CD Integration (Jenkins/GitLab)¶
#!/bin/bash
# performance-test.sh - CI/CD pipeline script
# Set variables
TEST_PLAN="test-plans/load-test.jmx"
RESULTS_DIR="results/$(date +%Y%m%d_%H%M%S)"
USERS=${USERS:-100}
DURATION=${DURATION:-300}
# Create results directory
mkdir -p $RESULTS_DIR
# Run JMeter test
jmeter -n -t $TEST_PLAN \
-Jusers=$USERS \
-Jduration=$DURATION \
-l $RESULTS_DIR/results.jtl \
-e -o $RESULTS_DIR/dashboard/ \
-j $RESULTS_DIR/jmeter.log
# Check for errors (exit code)
if [ $? -eq 0 ]; then
echo "Test completed successfully"
# Archive results
tar -czf $RESULTS_DIR.tar.gz $RESULTS_DIR
# Optional: Upload to artifact storage
# aws s3 cp $RESULTS_DIR.tar.gz s3://bucket/results/
else
echo "Test failed with errors"
exit 1
fi
Use Case 5: Database Performance Testing¶
# Test database performance with parameterized queries
jmeter -n -t database-test.jmx \
-Jdb.host=db.example.com \
-Jdb.port=5432 \
-Jdb.name=testdb \
-Jdb.user=testuser \
-Jdb.password=testpass \
-Jthreads=50 \
-Jrampup=30 \
-l db-results.jtl \
-e -o db-report/
# Generate report from existing results
jmeter -g db-results.jtl -o db-report-regenerated/
Best Practices¶
-
Always use non-GUI mode for actual testing: GUI mode consumes significant resources and affects test accuracy. Use
jmeter -nfor all performance tests. -
Allocate sufficient heap memory: Set JVM heap size to at least 25% of available RAM. For large tests:
export JVM_ARGS="-Xms2g -Xmx4g -XX:+UseG1GC" -
Use CSV format for result files: CSV format is more efficient than XML. Disable unnecessary data collection to reduce overhead:
jmeter.save.saveservice.response_data=false -
Implement proper ramp-up periods: Avoid starting all threads simultaneously. Use gradual ramp-up (typically 10-20% of test duration) to simulate realistic load patterns.
-
Leverage distributed testing for high loads: Single machine limitations can skew results. Use multiple JMeter servers for tests exceeding 500-1000 threads.
-
Parameterize test data: Use CSV Data Set Config or variables instead of hardcoded values. This enables easy test configuration and environment switching.
-
Monitor system resources during tests: Track CPU, memory, network, and disk I/O on both JMeter machines and target systems. High resource usage on JMeter indicates bottlenecks in test execution.
-
Version control test plans: Store
.jmxfiles and property files in Git. Use meaningful commit messages and tag releases for reproducibility. -
Implement proper correlation and assertions: Extract dynamic values (tokens, session IDs) and validate responses. Don't just measure speed—verify correctness.
-
Clean up between test runs: Clear results directories and logs. Reset application state when needed to ensure consistent test conditions.
Troubleshooting¶
| Issue | Solution |
|---|---|
| OutOfMemoryError during test | Increase heap size: export JVM_ARGS="-Xms2g -Xmx4g" or reduce threads/disable response data saving |
| Connection refused on remote servers | Check firewall rules for ports 1099 and 4000. Verify java.rmi.server.hostname is set correctly on server |
| Test results show 100% errors | Verify target URL is accessible, check proxy settings, review jmeter.log for detailed error messages |
| GUI freezes during large tests | Never run large tests in GUI mode. Use non-GUI: jmeter -n -t test.jmx -l results.jtl |
| Inconsistent results between runs | Ensure proper ramp-up, clear cache/cookies between runs, verify network stability, check target system load |
| Cannot generate HTML report | Verify results file format is compatible (CSV/JTL), ensure output directory is empty or use -f flag to force overwrite |
| Remote servers not starting | Check Java version compatibility (JDK 8+), verify RMI registry port is available, review jmeter-server.log |
| SSL/TLS certificate errors | Add certificate to Java keystore or disable validation: jmeter -Jhttps.default.protocol=TLSv1.2 |
| Slow test execution | Disable listeners in non-GUI mode, reduce assertion complexity, optimize regular expressions, use efficient extractors |
| "Non HTTP response code: java.net.SocketException" | Increase timeout values, check connection pool settings, verify target system capacity, reduce thread count |
| Distributed test results incomplete | Ensure all servers have same test plan version, check network connectivity, verify clock synchronization across servers |
| High CPU on JMeter machine | Reduce thread count, disable unnecessary processors/listeners, use simpler samplers, consider distributed testing |
| Cannot install plugins | Download Plugins Manager JAR manually to lib/ext/, ensure internet connectivity, check proxy settings |
| Results file corrupted or empty | Ensure sufficient disk space, check file permissions, verify JMeter process completed successfully |
| "Address already in use" error | Change server port: jmeter-server -Dserver_port=1100, kill existing JMeter processes, wait for port release |
Quick Reference: Command Line Options¶
| Option | Description | Example |
|---|---|---|
-n |
Non-GUI mode | jmeter -n -t test.jmx |
-t |
Test plan file | jmeter -t mytest.jmx |
-l |
Results log file | jmeter -n -t test.jmx -l results.jtl |
-j |
JMeter log file | jmeter -n -t test.jmx -j jmeter.log |
-r |
Run on all remote servers | jmeter -n -t test.jmx -r |
-R |
Run on specific servers | jmeter -n -t test.jmx -R server1,server2 |
-g |
Generate report from file | jmeter -g results.jtl -o report/ |
-e |
Generate report after test | jmeter -n -t test.jmx -l results.jtl -e -o report/ |
-o |
Output folder for report | jmeter -g results.jtl -o dashboard/ |
-H |
Proxy host | jmeter -H proxy.com -P 8080 |
-P |
Proxy port | jmeter -H proxy.com -P 8080 |
-u |
Proxy username | jmeter -H proxy.com -P 8080 -u user |
-a |
Proxy password | jmeter -H proxy.com -P 8080 -a pass |
-J |
Define JMeter property | jmeter -Jusers=100 -Jrampup=60 |
-G |
Define global property | jmeter -Gusers=100 (for remote servers) |
-D |
Define system property | jmeter -Dhttp.proxyHost=proxy.com |
-L |
Set log level | jmeter -Lorg.apache.jmeter=DEBUG |
-p |
Property file | jmeter -p custom.properties |
-q |
Additional property file | jmeter -q env.properties |
-X |
Exit remote servers | jmeter -n -t test.jmx -r -X |
-f |
Force delete output folder | jmeter -g results.jtl -o report/ -f |