Configurar un clúster de JMeter para las pruebas de carga del servidor web

Este tutorial te muestra cómo configurar un clúster de JMeter para realizar pruebas de carga. Para quien aún no lo conozca, la aplicación Apache JMeter es un software de código abierto, una aplicación 100% pura de Java diseñada para probar el comportamiento funcional y medir el rendimiento. Se desarrolló originalmente para probar aplicaciones web, pero desde entonces se ha ampliado a otras funciones de prueba. Puede utilizarse para simular una carga pesada en un servidor, grupo de servidores, red u objeto, para probar su resistencia, o para analizar el rendimiento general bajo diferentes tipos de carga.

Pero a medida que cada planteamiento empresarial se hace más grande, los ingenieros y probadores necesitan realizar más pruebas para asegurarse de que cada módulo de expansión puede servir a consumidores más grandes sin comprometer las operaciones diarias de producción. Para garantizar esto, JMeter ha introducido sus propios servicios al poder probar la prueba de rendimiento bajo entornos más grandes realizándola como un proceso de clustering.

En caso de que tu ordenador cliente de JMeter no pueda simular suficientes usuarios para cargar tu servidor, o esté limitado a nivel de red, puedes controlar varios motores JMeter remotos desde un único cliente JMeter. Al ejecutar JMeter de forma remota, puedes replicar una prueba en muchos ordenadores de gama baja y simular una carga mayor en el servidor. Una instancia del cliente JMeter puede controlar cualquier número de instancias remotas de JMeter y recoger todos los datos de ellas.

Las pruebas distribuidas son un tipo de pruebas en las que se utilizan varios sistemas para realizar pruebas de estrés. Las pruebas distribuidas se utilizan para probar sitios web y aplicaciones de servidor cuando trabajan con varios clientes simultáneamente.

1. Cómo funciona

Si ejecutamos nuestras pruebas de carga localmente con una sola aplicación JMeter, existen ciertas limitaciones en cuanto al número de usuarios que puedes ejecutar, aunque tu ordenador tenga suficiente CPU y memoria. Debido a esto, ¿cómo podemos crear un escenario con más de 1000 usuarios concurrentes utilizando JMeter? Debido a este escenario, la idea de JMeter en modo distribuido entra en escena.

Cuando hablamos de distribuir JMeter, nos referimos a una arquitectura Maestro-Esclavo en la que JMeter utiliza Java RMI [Remote Method Invocation] para interactuar con objetos en una red distribuida. Las imágenes siguientes son para resumir el flujo de trabajo:

Al utilizar JMeter bajo el diseño de un clúster, puedes asegurar que tus pruebas están habilitadas para tener un JMeter local (maestro) que se encarga de la ejecución de la prueba, junto con múltiples instancias remotas de JMeter (esclavos) que enviarán la solicitud a tu servidor de destino.

La conexión con el clúster JMeter / el servicio JMeter puede realizarse a través de

  1. Aplicación de escritorio de JMeter
  2. SSH / terminal
  3. VNC
  4. Punto final del servicio API (WIP)

2. Fase de instalación

Para la fase de instalación, primero haremos un inventario de lo que será cada servidor. A continuación, los detalles:

Inventario del sistema
IP Nombre de host SO Función Estado
172.20.0.111 jmeter01 CentOS 7 x64 bits Servidor JMeter 01 (maestro/esclavo) Listo
172.20.0.112 jmeter02 CentOS 7 x64 bits Servidor JMeter 02 (esclavo) Listo
172.20.0.113 jmeter03 CentOS 7 x64 bits Servidor JMeter 03 (esclavo) Listo
172.20.0.114 jmeter04 CentOS 7 x64 bits Servidor JMeter 04 (esclavo) Listo

Ahora vamos a ensuciarnos las manos, empezaremos por configurar el servidor con los prerrequisitos, suponiendo que cada servidor está bajo la configuración mínima del servidor. A continuación están los pasos:

 [root@jmeter01 /]# yum install -y wget initscripts net-tools 

Hacer lo anterior es opcional, sólo para asegurar que nuestra instalación y revisión funcionen sin problemas. Una vez hecha la instalación, tendrás la captura de pantalla como la siguiente

A continuación, tenemos que instalar los paquetes de Java, ya que es obligatorio para configurar JMeter como servicio. A continuación se muestran los pasos:

 [root@jmeter01 /]# wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm" 
[root@jmeter01 /]# yum localinstall -y jdk-8u131-linux-x64.rpm

El proceso será como el siguiente:

A continuación, instalaremos los paquetes de JMeter. En este tutorial, utilizaré la versión estable actual para la instalación de JMeter. Los pasos son como los siguientes:

 [root@jmeter01 /]# wget https://www-eu.apache.org/dist//jmeter/binaries/apache-jmeter-5.1.1.tgz 
[root@jmeter01 /]# tar -zxf apache-jmeter-5.1.1.tgz
[root@jmeter01 /]# ln -s /apache-jmeter-5.1.1 $HOME/jmeter
[root@jmeter01 /]# echo "export JMETER_HOME=$HOME/jmeter" >> /root/.bashrc
[root@jmeter01 /]# echo "export PATH=$PATH:$JMETER_HOME/bin" >> /root/.bashrc
[root@jmeter01 /]# source /root/.bashrc
[root@jmeter01 /]# curl -L https://jmeter-plugins.org/get/ > $HOME/jmeter/lib/ext/plugins-manager.jar
[root@jmeter01 /]# curl -L https://repo1.maven.org/maven2/kg/apc/cmdrunner/2.2/cmdrunner-2.2.jar > $HOME/jmeter/lib/cmdrunner-2.2.jar

Una vez que todo esté hecho, verás el progreso como se muestra a continuación

A continuación, utilizaremos un gestor de plugins para ayudar a instalar varios paquetes java necesarios para que nuestro JMeter funcione sin problemas. A continuación se muestran los pasos:

 [root@jmeter01 /]# java -cp $HOME/jmeter/lib/ext/plugins-manager.jar org.jmeterplugins.repository.PluginManagerCMDInstaller 
[root@jmeter01 /]# /root/jmeter/bin/PluginsManagerCMD.sh install jpgc-autostop,jpgc-casutg,jpgc-csl,jpgc-dummy,jpgc-ffw,jpgc-filterresults,jpgc-functions,jpgc-json,jpgc-mergeresults,jpgc-prmctl,jpgc-sense,jpgc-tst,jpgc-wsc

Si el progreso se ejecuta sin problemas, obtendrás la siguiente captura de pantalla

Ahora que todo está hecho en la parte de instalación, necesitarás crear el almacén de claves antes de iniciar JMeter como esclavo. Para ello, podemos utilizar el script que se incluye con los paquetes de Apache JMeter llamado create-rmi-keystore.sh . A continuación se muestran los pasos :-

 [root@jmeter01 ~]# $HOME/jmeter/bin/create-rmi-keystore.sh

A continuación se muestra la captura de pantalla

Ahora que ya hemos hecho prácticamente la instalación de JMeter, podemos proceder a realizar la configuración en el servicio JMeter para el proceso de distribución. Puedes seguir configurando el resto del servidor JMeter como la misma instalación que has hecho para este servidor.

3. Fase de configuración

Ahora en cuanto a la configuración para hacer como JMeter distribuido, sólo tenemos que editar el jmeter.properties dentro de la carpeta JMeter /bin como se indica a continuación

 [root@jmeter01 ~]# vim /root/jmeter/bin/jmeter.properties remote_hosts=172.20.0.111 ,172.20.0.112 ,172.20.0.113 ,172.20.0.114 

Observa que he añadido todo nuestro servidor JMeter en el archivo de configuración de JMeter. Por defecto, la configuración se establece como remote_hosts=127.0.0.1. Para esta configuración, sólo tienes que configurarlo en el servidor JMeter que asignar como Maestro

4. Fase de pruebas

Como todo está hecho, vamos a hacer la prueba y comparar los resultados para la prueba de carga de JMeter individual y la carga de JMeter distribuida.

Antes de empezar la prueba, vamos a hacer la suposición para la expectativa del resultado final. Para esta prueba, intentaremos ejecutar una consulta a la base de datos que se llama desde un sitio. Utilizaremos la URL para acceder al sitio y la incluiremos dentro del archivo JMX para que la ejecute el servicio JMeter. Para este tutorial, no incluiremos el paso de cómo crear un archivo JMX

Para que quede claro, a continuación se muestran las consultas simples que utilizaremos para ejecutar desde la base de datos a través de la URL de la web:

 [root@jmeter01 ~]# mysql -u shahril -p -h 10.124.12.13 
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 546695
Server version: 5.7.20-log MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> SELECT 1 FROM cassie_devdb.saml_users WHERE (username = '[email protected]') LIMIT 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)

Para tu información, puedes utilizar cualquier consulta que quieras para este tutorial. Como esta consulta no estaba afinada, se espera que aumente los recursos de la CPU cuando sea ejecutada por varias sesiones que programaremos utilizando el servicio JMeter

Ahora que todo está preparado y entendido, vamos a iniciar todo el servidor JMeter. A continuación se muestra el comando:

 [root@jmeter01 ~]# $HOME/jmeter/bin/jmeter-server & 
[1] 6149

Para proceder a la prueba, vamos a ejecutar el archivo JMX que desencadenará la consulta anterior en un único servidor JMeter como se indica a continuación:

 [root@jmeter01 /]# /root/jmeter/bin/jmeter -n -t /opt/jmeter/shahril_loadtest/testing.jmx 

Observa que el archivo JMX que contiene el hilo de ejecución es `testing.jmx`. Una vez ejecutado lo anterior, verás el resultado según la siguiente captura de pantalla

A continuación, vamos a ejecutar el mismo archivo JMX hacia JMeter en un entorno distribuido. A continuación se muestran los pasos:

 [root@jmeter01 /]# /root/jmeter/bin/jmeter -n -t /opt/jmeter/shahril_loadtest/testing.jmx -R 172.20.0.111,172.20.0.112,172.20.0.113,172.20.0.114 

Observa que el comando es prácticamente el mismo con la ejecución en una sola fase, sólo tienes que añadir una bandera de -R y añadir el otro servidor JMeter para que se incluya en la ejecución. Puedes ver el detalle de la bandera listada proporcionada por el comando JMeter como abajo:

 [root@jmeter01 /]# /root/jmeter/bin/jmeter --help 
_ ____ _ ____ _ _ _____ _ __ __ _____ _____ _____ ____
/ \ | _ \ / \ / ___| | | | ____| | | \/ | ____|_ _| ____| _ \
/ _ \ | |_) / _ \| | | |_| | _| _ | | |\/| | _| | | | _| | |_) |
/ ___ \| __/ ___ \ |___| _ | |___ | |_| | | | | |___ | | | |___| _
/_/ \_\_| /_/ \_\____|_| |_|_____| \___/|_| |_|_____| |_| |_____|_| \_\ 5.1.1 r1855137

Copyright (c) 1999-2019 The Apache Software Foundation


To list all command line options, open a command prompt and type:

jmeter.bat(Windows)/jmeter.sh(Linux) -?

--------------------------------------------------

To run Apache JMeter in GUI mode, open a command prompt and type:

jmeter.bat(Windows)/jmeter.sh(Linux) [-p property-file]

--------------------------------------------------

To run Apache JMeter in NON_GUI mode:
Open a command prompt (or Unix shell) and type:

jmeter.bat(Windows)/jmeter.sh(Linux) -n -t test-file [-p property-file] [-l results-file] [-j log-file]

--------------------------------------------------

To run Apache JMeter in NON_GUI mode and generate a report at end :
Open a command prompt (or Unix shell) and type:

jmeter.bat(Windows)/jmeter.sh(Linux) -n -t test-file [-p property-file] [-l results-file] [-j log-file] -e -o [Path to output folder]

--------------------------------------------------
To generate a Report from existing CSV file:
Open a command prompt (or Unix shell) and type:

jmeter.bat(Windows)/jmeter.sh(Linux) -g [csv results file] -o [path to output folder (empty or not existing)]

--------------------------------------------------

To tell Apache JMeter to use a proxy server:
Open a command prompt and type:

jmeter.bat(Windows)/jmeter.sh(Linux) -H [your.proxy.server] -P [your proxy server port]

---------------------------------------------------

To run Apache JMeter in server mode:
Open a command prompt and type:

jmeter-server.bat(Windows)/jmeter-server(Linux)

---------------------------------------------------

A continuación, una vez que el archivo JMX se haya ejecutado en el entorno distribuido, verás el resultado según la siguiente captura de pantalla

Genial, ahora hemos ejecutado con éxito nuestra prueba en ambas fases del entorno. Para ver las diferencias de la comparación, he configurado un panel de control con Grafana, ya que esto es sólo para mostrar las diferencias de los resultados, no vamos a cubrir la forma de configurar Grafana como panel de control.

Basándonos en el uso de la CPU del servidor que aloja nuestro sitio web, a continuación se muestran los resultados de un único hilo de JMeter:

Y la imagen de abajo es el resultado bajo un hilo JMeter distribuido:

Claramente, a partir de la comparación anterior, podemos ver que logramos introducir más hilos para ser ejecutados en el servidor de destino para ver la limitación de una aplicación puede aceptar.

También te podría gustar...