Stress test de aplicaciones Web con JMeter

Apache JMeter es una aplicación open source desarrollada en Java, diseñada para comprobar el funcionamiento de un sitio o aplicación Web con alta carga y medir su rendimiento. Es útil para testear el rendimiento tanto de sitios dinámicos como de recursos estáticos. Especialmente puede ser utilizada para simular alta carga en un servidor Web, grupo de servidores, red, etc. Este tipo de análisis permite medir la fortaleza de una aplicación o analizar el rendimiento general ante diferentes cargas (proceso conocido como "prueba de estrés" o stress test).

Este artículo explica cómo instalar JMeter en GNU/Linux y realizar un test básico sobre una aplicación Web.







Para comenzar, descargar la última versión disponible desde la página de descargas: Download Apache JMeter

emi@hal9000:~$ mkdir software emi@hal9000:~/software$ cd software/ emi@hal9000:~/software$ wget http://apache.dattatec.com/jmeter/binaries/apache-jmeter-5.1.1.zip

JMeter es una aplicación Java y requiere Java 8 o superior. Por ende, comprobar que la versión de Java instalada sea 1.8 o superior:

emi@hal9000:~$ java -version openjdk version "1.8.0_222" OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1~deb9u1-b10) OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)

Si no se encuentra disponible, en Debian/Devuan y derivados es posible instalar Java 8+ ejecutando apt-get install openjdk-8-jre .

Proceder con la instalación de JMeter, que consiste en simplemente extraer el paquete en /opt o cualquier otro directorio que se desee.

Pasar a superusuario:

emi@hal9000:~/software$ su

Extraer el paquete y crear un enlace simbólico en /usr/bin :

root@hal9000:/home/emi/software# cd /opt root@hal9000:/opt# unzip /home/emi/software/apache-jmeter-5.1.1.zip root@hal9000:/opt# ln -s /opt/apache-jmeter-5.1.1/bin/jmeter /usr/bin/ root@hal9000:/opt# exit

Ejecutar JMeter:

emi@hal9000:~/software$ jmeter Sep 05, 2019 12:38:09 PM java.util.prefs.FileSystemPreferences$1 run INFO: Created user preferences directory. ================================================================================ Don't use GUI mode for load testing !, only for Test creation and Test debugging. For load testing, use CLI Mode (was NON GUI): jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder] & increase Java Heap to meet your test requirements: Modify current env variable HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m" in the jmeter batch file Check : https://jmeter.apache.org/usermanual/best-practices.html ================================================================================

Luego de unos segundos se abre la GUI de JMeter:

Crear un test

Se observa, en la salida de la consola al momento de lanzar JMeter, la advertencia que indica que no se deben correr test desde la GUI. Sólo se debe utilizar para crear un test, pero correrlo en modo CLI (command line):

Don't use GUI mode for load testing !, only for Test creation and Test debugging. For load testing, use CLI Mode (was NON GUI): jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]

Crear un test simple se divide en tres pasos: crear un grupo de hilos, un controlador de bucle y una o más solicitudes (en este caso HTTP).

Desde el "Test Plan" crear un "Thread Group":

El grupo de hilos define la cantidad de hilos y el tiempo en segundo hasta activar a todos en simultáneo (Ramp-Up). En este caso se lanzan 80 hilos (usuarios en paralelo) en un tiempo máximo de 60 segundos. A partir de ese tiempo permanecerán los 80 activos en paralelo.

En el controlador de hilo se indica que ciclen por siempre:

Dentro del controlador de hilos se crean uno o más pedidos HTTP:

Como mínimo se especifica un protocolo ("https"), nombre de host, puerto, método ("GET", en el ejemplo) y ruta o recurso (Path). Para cada solicitud es posible determinar cualquier número de parámetros para enviar con la solicitud, datos del cuerpo y archivos a subir. En este caso se trata de solicitudes GET simples (sin parámetros).

Al finalizar, guardar los cambios y cerrar JMeter.

Correr un test

Habiendo guardado la configuración del test en un archivo .jmx , es el momento de correrlo en modo CLI:

$ jmeter -n -t test.jmx -l test.resultados -e -o test.reporte

Se lanza el test y se observa como van incrementando la cantidad de hilos activos hasta llegar a 80 a los 60 segundos:

Al mismo tiempo el servidor Web alcanza un uso intensivo de CPU y memoria:

Cuando se corre un test con un bucle infinito, es necesario indicarle a JMeter cuándo detenerse. Si se utiliza Ctrl+C , simplemente se detiene totalmente el proceso y se pierde el reporte (sólo quedan los resultados, solicitudes realizadas en el archivo pasado como parámetro a la opción -l , lo cual no es de gran utilidad). Para detener el test correctamente es necesario ejecutar el script shutdown.sh dentro del directorio bin/ de la instalación de JMeter.

Al momento de lanzar JMeter en modo CLI se observa que se abre el puerto 4445 localmente para recibir mensajes de control (Shutdown/StopTestNow/HeapDump/ThreadDump):

emi@hal9000:~$ netstat -tulpn 2>/dev/null | grep 4445 udp6 0 0 :::4445 :::* 5882/java

El script shutdown.sh envía el mensaje "Shutdown" al puerto 4445:

emi@hal9000:~$ /opt/apache-jmeter-5.1.1/bin/shutdown.sh Sending Shutdown request to port 4445

Desde el test se observa que el mensaje ha sido recibido y se comienzan a cerrar los hilos ordenadamente hasta finalizar:

Una vez terminado el test, se crea el directorio pasado como parámetro a la opción -o , el cual contiene el reporte en formato HTML:

Es importante que este directorio no exista o esté vacío al momento de lanzar el test.

Abrir el archivo index.html con cualquier navegador:

El reporte contiene una gran cantidad de información y gráficas, por ejemplo tiempo de respuesta del servidor a lo largo del tiempo:

Se observa el momento exacto en que el servidor Web colapsa completamente y se debe detener el test.

Referencias



Tal vez pueda interesarte

