Hoja de Referencia de Apache JMeter¶
Instalación¶
| Platform | Comando |
|---|---|
| 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 |
Comandos Básicos¶
| Comando | Descripción |
|---|---|
jmeter |
Iniciar GUI de JMeter |
jmeter -t test-plan.jmx |
Abrir plan de pruebas específico en GUI |
jmeter -n -t test.jmx -l results.jtl |
Ejecutar prueba en modo no GUI con resultados |
jmeter -n -t test.jmx -l results.jtl -e -o report/ |
Ejecutar prueba y generar panel de control HTML |
jmeter --version or jmeter -v |
Mostrar versión de JMeter |
jmeter --help or jmeter -h |
Mostrar ayuda y opciones disponibles |
jmeter -? |
Listar todas las propiedades disponibles |
jmeter -n -t test.jmx -j jmeter.log |
Ejecutar prueba con archivo de registro personalizado |
jmeter -g results.jtl -o dashboard/ |
Generar informe HTML a partir de resultados existentes |
jmeter -p custom.properties |
Lanzar con archivo de propiedades personalizado |
jmeter -Xmx4g |
Lanzar con tamaño de heap aumentado (4GB) |
jmeter-server |
Iniciar JMeter en modo servidor para pruebas distribuidas |
jmeter -n -t test.jmx -l results.csv |
Ejecutar prueba y guardar resultados como CSV |
jmeter -n -t test.jmx -l results.xml |
Ejecutar prueba y guardar resultados como XML |
jmeter -Jusers=100 |
Anular el valor de la propiedad en tiempo de ejecución |
| Comando | Descripción |
|---|---|
jmeter -n -t test.jmx -r |
Ejecutar prueba en todos los servidores remotos |
jmeter -n -t test.jmx -R server1:1099,server2:1099 |
Ejecutar prueba en servidores remotos específicos |
jmeter -n -t test.jmx -Gusers=100 -Grampup=60 |
Establecer propiedades globales para servidores remotos |
jmeter -n -t test.jmx -r -X |
Ejecutar pruebas distribuidas y salir de servidores remotos después |
jmeter -n -t test.jmx -q env.properties -q users.properties |
Usar múltiples archivos de propiedades |
jmeter -H proxy.example.com -P 8080 |
Ejecutar con proxy HTTP |
jmeter -H proxy.com -P 8080 -u username -a password |
Ejecutar con proxy autenticado |
jmeter -Lorg.apache.jmeter=DEBUG |
Establecer nivel de log a DEBUG |
jmeter -Lorg.apache.jmeter.protocol.http=DEBUG |
Establecer nivel de registro para paquete específico |
jmeter-server -Djava.rmi.server.hostname=192.168.1.100 |
Iniciar servidor con nombre de host específico |
jmeter-server -Dserver_port=1099 |
Iniciar servidor en puerto personalizado |
jmeter -n -t test.jmx -Jsummariser.interval=30 |
Establecer intervalo de resumen en 30 segundos |
jmeter -n -t test.jmx -Jjmeter.save.saveservice.output_format=xml |
Forzar formato de salida XML |
jmeter -n -t test.jmx -Jjmeter.save.saveservice.response_data=true |
Incluir datos de respuesta en resultados |
jmeter -XX:+UseG1GC -n -t test.jmx |
Ejecutar con el recolector de basura G1 |
jmeter -Dcom.sun.management.jmxremote -n -t test.jmx |
Habilitar monitoreo JMX |
jmeter -Dhttp.keepAlive=false -n -t test.jmx |
Deshabilitar HTTP keep-alive |
jmeter -g results.jtl -o dashboard/ -f |
Forzar sobrescritura del dashboard existente |
jmeter -N "localhost | *.internal.com" |
Establecer hosts sin proxy |
PluginsManagerCMD.sh install jpgc-casutg,jpgc-synthesis |
Instalar plugins de JMeter mediante CLI |
Archivo de Propiedades de JMeter (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
Archivo de Propiedades de Usuario (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
Propiedades del Sistema¶
# 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
Configuración de JVM (jmeterscript)¶
# 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"
Configuración de Pruebas Distribuidas¶
# 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
Casos de Uso Comunes¶
Caso de Uso 1: Prueba de Carga Básica con Informe HTML¶
# 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
Caso de Uso 2: Prueba de Carga Distribuida en Múltiples Servidores¶
# 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
Caso de Uso 3: Pruebas de Rendimiento de API con Múltiples Entornos¶
# 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/
Caso de Uso 4: Integración CI/CD (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
Caso de Uso 5: Pruebas de Rendimiento de Base de Datos¶
# 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/
Mejores Prácticas¶
-
Siempre usar modo no GUI para pruebas reales: El modo GUI consume recursos significativos y afecta la precisión de la prueba. Usar
jmeter -npara todas las pruebas de rendimiento. -
Asignar suficiente memoria heap: Establecer el tamaño de heap de JVM a al menos 25% de la RAM disponible. Para pruebas grandes:
export JVM_ARGS="-Xms2g -Xmx4g -XX:+UseG1GC" - Usar formato CSV para archivos de resultados: El formato CSV es más eficiente que XML. Deshabilite la recopilación de datos innecesarios para reducir la sobrecarga:
jmeter.save.saveservice.response_data=false -
Implementar períodos de ramp-up adecuados: Evite iniciar todos los hilos simultáneamente. Use un ramp-up gradual (típicamente 10-20% de la duración de la prueba) para simular patrones de carga realistas.
-
Aprovechar pruebas distribuidas para cargas altas: Las limitaciones de una sola máquina pueden sesgar los resultados. Use múltiples servidores JMeter para pruebas que excedan 500-1000 hilos.
-
Parametrizar datos de prueba: Use CSV Data Set Config o variables en lugar de valores codificados. Esto permite una configuración de prueba fácil y cambio de entorno.
-
Monitorear recursos del sistema durante las pruebas: Rastree CPU, memoria, red y E/S de disco tanto en máquinas JMeter como en sistemas objetivo. Un alto uso de recursos en JMeter indica cuellos de botella en la ejecución de pruebas.
-
Controlar versiones de planes de prueba: Almacenar
.jmxarchivos y archivos de propiedades en Git. Use mensajes de commit significativos y etiquete lanzamientos para reproducibilidad. -
Implementar correlación y aserciones adecuadas: Extraiga valores dinámicos (tokens, ID de sesión) y valide respuestas. No solo mida la velocidad, verifique la corrección.
-
Limpiar entre ejecuciones de pruebas: Borre directorios de resultados y registros. Restablezca el estado de la aplicación cuando sea necesario para garantizar condiciones de prueba consistentes.
Resolución de problemas¶
| Problema | Solución |
|---|---|
| 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 | Asegúrese de tener una rampa de inicio adecuada, limpiar caché/cookies entre ejecuciones, verificar la estabilidad de la red, comprobar la carga del sistema objetivo |
| 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 | Deshabilitar listeners en modo no GUI, reducir la complejidad de las aserciones, optimizar expresiones regulares, usar extractores eficientes |
| "Non HTTP response code: java.net.SocketException" | Aumentar valores de timeout, verificar configuraciones de grupo de conexiones, verificar capacidad del sistema de destino, reducir recuento de hilos |
| Distributed test results incomplete | Asegúrese de que todos los servidores tengan la misma versión del plan de pruebas, verifique la conectividad de red, compruebe la sincronización de reloj entre servidores |
| High CPU on JMeter machine | Reducir el recuento de hilos, deshabilitar procesadores/listeners innecesarios, usar muestreadores más simples, considerar pruebas distribuidas |
| Cannot install plugins | Download Plugins Manager JAR manually to lib/ext/, ensure internet connectivity, check proxy settings |
| Results file corrupted or empty | Asegúrese de tener suficiente espacio en disco, verifique los permisos de archivo, confirme que el proceso de JMeter se completó correctamente |
| "Address already in use" error | Change server port: jmeter-server -Dserver_port=1100, kill existing JMeter processes, wait for port release |
| ## Referencia rápida: Opciones de línea de comandos |
| Opción | Descripción | Ejemplo |
|---|---|---|
-n |
Modo sin interfaz gráfica | jmeter -n -t test.jmx |
-t |
Archivo de plan de pruebas | jmeter -t mytest.jmx |
-l |
Archivo de registro de resultados | jmeter -n -t test.jmx -l results.jtl |
-j |
Archivo de registro de JMeter | jmeter -n -t test.jmx -j jmeter.log |
-r |
Ejecutar en todos los servidores remotos | jmeter -n -t test.jmx -r |
-R |
Ejecutar en servidores específicos | jmeter -n -t test.jmx -R server1,server2 |
-g |
Generar informe desde archivo | jmeter -g results.jtl -o report/ |
-e |
Generar informe después de la prueba | jmeter -n -t test.jmx -l results.jtl -e -o report/ |
-o |
Carpeta de salida para informe | jmeter -g results.jtl -o dashboard/ |
-H |
Host proxy | jmeter -H proxy.com -P 8080 |
-P |
Puerto proxy | jmeter -H proxy.com -P 8080 |
-u |
Nombre de usuario de proxy | jmeter -H proxy.com -P 8080 -u user |
-a |
Contraseña de proxy | jmeter -H proxy.com -P 8080 -a pass |
-J |
Definir propiedad de JMeter | jmeter -Jusers=100 -Jrampup=60 |
-G |
Definir propiedad global | jmeter -Gusers=100 (for remote servers) |
-D |
Definir propiedad del sistema | jmeter -Dhttp.proxyHost=proxy.com |
-L |
Establecer nivel de log | jmeter -Lorg.apache.jmeter=DEBUG |
-p |
Archivo de propiedades | jmeter -p custom.properties |
-q |
Archivo de propiedades adicional | jmeter -q env.properties |
-X |
Salir de servidores remotos | jmeter -n -t test.jmx -r -X |