Continuando con la línea del post anterior, les muestro los resultados a los que llegamos tras el experimento que realizaron Santiago Peraza y Pablo Barceló de Abstracta. Nuestro objetivo era realizar un benchmark comparativo entre las herramientas Gatling y JMeter, en sus versiones 2.2.2 y 3.0 respectivamente.
Objetivo del experimento
Queríamos contestar estas preguntas:
- ¿Cuál es la cantidad máxima de threads que puedo ejecutar con cada una de las herramientas antes de comenzar a obtener errores o de saturar algún recurso básico?
- ¿Dada la misma carga generada por ambas herramientas, hay un uso de recursos significativamente distinto?
Configuración de la prueba
El experimento tenía como única variable la herramienta. El resto lo conservamos igual: infraestructura, prueba, escenario de carga, sistema bajo prueba, red, etc.
Infraestructura para la prueba
Para realizar la prueba decidimos que la mejor opción era usar dos máquinas, ambas conectadas a un mismo router mediante dos cables de conexión Ethernet, y generar carga haciendo peticiones desde una a la otra. Para eso, en una de las PC (Laptop A) instalamos el software IIS de Microsoft, el cual convierte a una PC en un servidor web, y la otra PC (Laptop B) la utilizamos como generadora de carga.
Consideraciones de configuración
Para realizar una comparación lo más justa posible fue necesario tener en cuenta algunos factores que pueden incidir en la performance, como son los pedidos secundarios, las cookies y el cache. Gatling maneja las cookies y el caché por defecto; en el caso de JMeter no, por lo tanto, fue necesario configurar las herramientas del mismo modo para evitar resultados tendenciosos.
- Caché: Al momento de definir la prueba se puede optar por hacer uso del manejo del caché (en ese caso es necesario agregar un elemento del tipo HTTP Cache Manager en JMeter) o sin manejar el caché (en este caso es necesario deshabilitar el manejo de caché por parte de Gatling, agregando la línea disableCaching en la configuración del protocolo HTTP). En nuestro caso optamos por deshabilitar el manejo del caché en Gatling para de esta forma generar una carga mayor durante las pruebas.
- Pedidos secundarios: Tanto Gatling como JMeter no invocan los pedidos secundarios por defecto, por lo tanto, en el script de Gatling incluimos la línea inferHtmlResources, y en JMeter habilitamos la opción Retrieve All Embedded Resources del HTTP Request.
- Cookies: Teniendo en cuenta que los pedidos los realizamos sobre un sitio web estático, no fue necesario tener en cuenta el manejo de las cookies.
Escenario de prueba
El escenario que se preparó en ambas herramientas fue el siguiente:
- Número de usuarios virtuales concurrentes incremental, utilizando un ramp-up de un minuto en todas las ejecuciones.
- Iteraciones sin fin y constantes por la duración de la prueba
- Duración de la prueba: 5 minutos
Scripts de prueba en Gatling y JMeter
Los scripts son muy simples y ambos hacen lo mismo.
Resultados
#1 – Diferente manejo de conexiones e hilos
El primer resultado fue lo que ya comenté en el post anterior, que en JMeter maneja distinto las conexiones, con lo cual es necesario hacer un ajuste a nivel de sistema operativo para poder llegar a la misma cantidad de usuarios virtuales concurrentes.
#2 – Cantidad de carga en la que se observan fallos en los resultados es similar
Si bien no hilamos muy fino, no buscamos la cantidad exacta de usuarios ante la cual se satura, el orden es el mismo, no hay una diferencia significativa. Con ambas herramientas se generó la carga de 4.000 usuarios virtuales, donde se comenzó a ver que los pedidos http fallaban, lo cual indica que no se puede confiar en los resultados que se obtienen. Esto en realidad sucedió tanto por saturación del lado de la generadora como del lado del servidor, pero observando los recursos, la principal saturación se observaba en el laptop donde ejecutaba la generadora de carga.
#3 – Cantidad de usuarios que cada herramienta puede generar sin saturar el CPU
Por más que parezca absurdo, la cantidad máxima de usuarios virtuales que se pueden generar sin llegar al 100% de CPU de la máquina con la que se genera la carga es de 4. Esto sucede igual con ambas herramientas, y al ejecutar 5 en concurrencia “se comen” el 100% de CPU durante toda la prueba.
Esto se explica por el hecho de que son requests uno tras otro, sin pausas entre uno y otro, y las respuestas son casi inmediatas, con lo cual cada hilo está constantemente trabajando. Yo me esperaba un resultado muy diferente en este aspecto, pero así resultó.
#4 – Ante una carga de 4.000 usuarios virtuales, se observa distinto uso de recursos
Veamos las gráficas de monitorización básica realizada sobre la laptop de la generadora de carga para analizar las diferencias. Primero la ejecución de JMeter marcada en rojo:
Luego la ejecución con Gatling marcada en rojo:
Algunas cosas que se observan:
- Si bien ambas estaban utilizando el 100% del CPU, en el caso de JMeter se observa mayor uso de CPU por el sistema, lo cual podría explicarse por tener mayor cantidad de hilos para manejar los usuarios virtuales.
- Gatling utiliza menos memoria que JMeter. Se puede ver en la gráfica que JMeter utiliza casi el 100%, o sea, casi 6GB, y Gatling utiliza un poco más de 4GB, o sea, aproximadamente un 30% menos. Esto se podría explicar también por el manejo de hilos, ya que Gatling necesita menos hilos en memoria que JMeter para la misma cantidad de usuarios virtuales.
- Gatling parece utilizar más red, lo cual no tendría sentido a menos que haya generado más carga. Si JMeter generó menos carga es porque debido a que estaba más saturado quizá no pudo ejecutar con la misma intensidad que Gatling.
- Se observa que Gatling utilizó menos disco que JMeter, y lo curioso es que la mayoría en JMeter son lecturas. Acá faltaría un poco más de análisis para ver cuál es el motivo de esta diferencia, pero al no significar un cuello de botella, tampoco me resulta tan interesante.
Cerrando…
En conclusión, si bien no hay mucha diferencia entre la carga soportada por Gatling y JMeter, el segundo requiere de configuración inicial extra y además utiliza aproximadamente un 30% más de memoria RAM que Gatling.
¿Tienes alguna experiencia para compartir al respecto?
Agrego que se trataba de una laptop con 6gb de ram y un Intel Core i5-5200U de 2.20GHz
2 núcleos y 4 hilos por núcleo http://ark.intel.com/es/products/85212/Intel-Core-i5-5200U-Processor-3M-Cache-up-to-2_70-GHz
Mi duda es cual de las dos es más facil de usar?
JMeter es más visual, para usar Gatling tenés que saber programar. Eso ya puede ser útil en la decisión.
Ambos tienen un recorder. En ambos casos tenes buena documentación.
En ambos casos tenés que saber del protocolo que estás probando, y creo que eso es de lo más complejo a aprender, la herramienta en cualquier caso creo que es lo secundario al momento de hacer una buena prueba de performance.
Espero haber aportado!