Skip to main content

Mide la performance de los sitios webs mediante Gatling

En este artículo vamos a explorar la herramienta de Gatling, un programa que nos permitirá realizar pruebas de rendimiento sobre páginas web. Veremos el valor que nos ofrece y cómo utilizarlo.

 

¿Que es Gatling?

Se trata de una herramienta Open Source y multiplataforma, por lo cual no tendremos limitaciones en cuanto a su uso. Además, ofrece una gestión óptima de los recursos del sistema frente a otras herramientas como JMeter. Estas pruebas se pueden hacer sobre diversos protocolos como pueden ser HTTP (páginas web, servicios rest), FTP, WebSockets, etc.

Las pruebas de Gatling consistirán en simulaciones donde se realizarán flujos de uso de la web, y al final obtendremos un reporte detallado con los tiempos de respuesta, resultados de las peticiones, etc.

¿En que consisten las pruebas de rendimiento?

Las pruebas de rendimiento sirven para darnos información de la web acerca de lo siguiente:

Número máximo de usuarios

Podremos saber cual es el máximo de usuarios simultáneos capaces de realizar una acción sobre una página. Ejemplo: Usuarios realizando una compra.

Tiempo de respuesta de la web al haber varios usuarios simúltaneamente

Cuando se prueba una funcionalidad con un solo usuario la web podrá responder de forma efectiva, pero cuando hay muchos usuarios el tiempo de respuesta puede verse afectado. Estas pruebas son capaces de detectar este incremento del tiempo respuesta debido al número de usuarios.

Comportamiento del sitio con una carga esperada de usuarios

Esto puede ser muy interesante ya que con Gatling vamos a poder ser capaces de saber cómo se va a comportar nuestro sitio cuando sabemos que van a entrar una gran cantidad de usuarios a realizar una acción concreta. Ejemplo: Prueba de 10.000 compras en un una tienda electrónica tras una campaña publicitaria.

¿Qué valor aportan estas pruebas?

Como hemos visto con las posiblidades que nos traen las pruebas de rendimiento, podemos utilizar estas para poder medir la performance de nuestros sitios web de diferentes formas. Con Gatling podremos ejecutar dichas pruebas cuando lo necesitemos.

Esto nos puede servir para ejecutar estas pruebas cada cierto tiempo. Al principio un sitio web podría funcionar bien, pero a medida que se vayan añadiendo nuevas funcionalidades y aumente el volumen de la página, puede llegar a ser necesario una revisión periódica para confirmar que los resultados son los esperados.

Con esta información, si vemos que con el paso del tiempo los reportes de Gatling nos indican que estan disminuyendo los tiempos de respuesta, o que se mantienen pero con menos usuarios, podemos detectar un problema de rendimiento y tomar decisiones al respecto.

Requisitos del sistema

Un detalle importante a la hora de realizar las pruebas de estrés es lo siguiente: para que los reportes devueltos por las simulaciones sean de confianza lo ideal es realizarlas en entornos con las mismas características que en producción (misma RAM, misma configuración del Apache y base de datos, etc). También es importante que sea en un entorno diferente del de producción, ya que estas simulaciones pueden provocar una caída del servidor.

Instalación

Para instalar Gatling deberemos de descargar la herramienta desde el sitio oficial.

Esto nos dará un archivo comprimido con la instalación de Gatling lista para poder comenzar con nuestras pruebas de estrés.

La estructura de carpetas es la siguiente:

  • bin  : ejecutables de Gatling para realizar las pruebas.
  • conf : archivos de configuración avanzados de Gatling.
  • lib: ejecutables de Java usados por Gatling para funcionar.
  • results: Resultados de las simulaciones de Gatling.
  • user-files: aquí se irán guardando las simulaciones realizadas.

Realización de pruebas de estrés

Las pruebas de estrés de Gatling se realizan a través de simulaciones hechas mediante scripts programados con el lenguaje Scala.

Estos scripts permitirán simular las peticiones que hagamos en una página web, permitiendo completar un flujo. Ejemplo: entrar en una tienda de comercio electrónico y completar un proceso de compra.

Al tener Gatling instalado ya existen varios ejemplos de scripts en Scala, en la carpeta user-files/simulations.

A primera vista puede parecer un poco complicado pero Gatling lo facilita todo mediante el recorder. Esta herramienta nos permite hacer todas las operaciones de nuestra simulación desde un navegador, y el programa se encargará de generar un código base para la simulación, que podremos editar a futuro para posibles optimizaciones. La edición de los scripts es opcional pero conveniente para una mejor ajuste de las pruebas de estrés.

Las pruebas de recorder las realizaremos con el navegador Firefox.

Para utilizar el recorder necesitaremos configurar un proxy en el navegador a la ip 127.0.0.1 . A continuación se muestra un ejemplo, accediendo a Preferencias -> Proxy de red -> Configuración.

Configuración de proxy con Gatling

Importante tener en cuenta que una vez que se configura el proxy , el navegador quedará inutilizado hasta que comience la grabación.

Una vez listo esto, ejecutaremos el script recorder, situado en la carpeta bin. Existen dos ejecutables para ello, un archivo .sh para Linux y otro .bat para ejecutarlo desde Windows.

Ejemplo para Linux:

cd gatling
./bin/recorder.sh

Tras ejecutar el comando veremos la interfaz del recorder:

Interfaz del script recorder.sh

Esta interfaz nos servirá para crear una simulación. Los campos más importantes a tener en cuenta son:

  • Class name: nos permitirá indicar el nombre de la simulación. Será el nombre de la clase que albergará el script de Scala
  • Package: nos permitirá indicar el nombre del paquete al que pertenece la clase que contiene la simulación. Normalmente el nombre del proyecto.
  • Output folder: Nos permite indicar la carpeta donde se guardará el script con la simulación.

Con esto configurado, le podremos dar al botón de Start para comenzar la simulación. Ahora en el navegador deberemos hacer las peticiones que haría el usuario para hacer las acciones que completen nuestro flujo.

Nota: en caso de estar haciendo un flujo que nos lleve a un servicio externo (como una pasarela de pago) tendremos que ver como evitarlo ya que las pruebas de estrés hacen una cantidad de peticiones no aceptables por servicios que se usan en producción. Por ejemplo, en el caso de que un proceso involucre una pasarela de pago, se puede cambiar en los tests la pasarela usada para que apunte al entorno de pruebas de dicha pasarela.

Una vez hechas las acciones pararemos la ejecución con el botón 'Stop & Save'. Tras finalizar, tendremos un script de Scala listo para hacer una simulación en donde hubiéramos indicado (campo Output folder).

Tras acabar la grabación deberemos quitar la configuración de proxy para que el navegador funcione de la forma habitual

Si abrimos el archivo podemos ver el código que ha generado Gatling para realizar la simulación, donde se simulan todas las peticiones que hemos ejecutado manualmente. Este código se puede alterar para ser más óptimo, permitiendo mostrar mejores resultados en los reportes.

Ejemplo de código simplificado (simulación de ejemplo que nos ofrece Gatling):

...

class BasicSimulation extends Simulation {

  val httpConf = http
    .baseURL("http://computer-database.gatling.io") // Here is the root for all relative URLs
    .acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") // Here are the common headers
    .doNotTrackHeader("1")
    .acceptLanguageHeader("en-US,en;q=0.5")
    .acceptEncodingHeader("gzip, deflate")
    .userAgentHeader("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0")

  val headers_10 = Map("Content-Type" -> "application/x-www-form-urlencoded") // Note the headers specific to a given request

  val scn = scenario("Scenario Name") // A scenario is a chain of requests and pauses
    .exec(http("request_1")
      ...

  setUp(scn.inject(atOnceUsers(10)).protocols(httpConf))
}

 

Ahora mismo nos quedaremos con una línea que veremos al final:

 setUp(scn.inject(atOnceUsers(10)).protocols(httpConf))

Esta es muy importante, define que la simulación se hara con 10 usuarios al mismo tiempo. Esto se puede modificar para indicar que queremos más usuarios simultáneos. Existen otras modalidades, las cuales se pueden ver aquí .

Con todos los pasos realizados ya podemos ejecutar una simulación. Aquí se mostrará la ejecuión de una de las simulaciones de prueba (BasicSimulation).

Para ejecutar la simulación deberemos utilizar el script de Gatling encontrado en la carpeta bin (con su versión para Windows/Linux), preferiblemente desde línea de comandos:

 

cd gatling
./bin/gatling.sh

 

El script nos pedirá lo siguiente:

  • Simulation number: número de la simulación que queremos ejecutar.
  • Simulation id: Se usará como prefijo de la carpeta donde se guardará la simulación.
  • Description: Descripción de la simulación.

Ejecución de la simulación

Una vez terminada, nos indicará la ruta donde se han guardado los reportes donde podremos ver los resultados.

 

Reporte de gatling

Ahora podremos ver los resultados, los cuales son bastante extensos y nos darán bastante información sobre el comportamiento del sistema ante una carga alta de usuarios.

Integración continua

Ya podemos utilizar Gatling de forma manual para realizar simulaciones pero, ¿y si quisieramos automatizarlo? Existe un plugin de Gatling para el sistema de integración continua Jenkins. Gracias a esto podemos, en cada ejecución de Jenkins, poder realizar las simulaciones de Gatling para nuestro proyecto. Normalmente Jenkins se configura para ejecutarse cada vez que se realizan cambios por lo cual si un cambio supusiera un problema en la performance podríamos detectarlo y solucionarlo sin que hayan consecuencias en producción. ¡Maravilloso!

Recursos

Omar Lopesino

Omar Lopesino

Senior Drupal developer