En este post te comparto algo investigado y escrito por Alejandro Berardinelli de Abstracta, donde explica cómo ajustar la carga simulada con JMeter en tiempo de ejecución, pudiendo variar dinámicamente el throughput, utilizando el Constant Throughput Timer, Beanshell Server, y ajustando el parámetro en ejecución.
En ciertas ocasiones resulta necesario (o al menos útil) controlar, en tiempo real, la carga que estamos generado en un test de performance. Esto es, variar la carga mientras se está ejecutando la prueba, sin necesidad de parar la prueba que está ejecutando, cambiar configuraciones y volver a iniciar la ejecución.
Constant Throughput Timer
Para poder realizar esto utilizando solamente JMeter, se encontró que el único elemento que permite modificar el throughput en tiempo de ejecución es el Constant Throughput Timer.
Típicamente, para modificar la carga en una prueba se suele variar la cantidad de UVs (Usuarios Virtuales). El Constant Throughput Timer en cambio, introduce pausas entre cada request que se envía de forma de variar la cantidad de requests por segundo y así aproximar el throughput objetivo; manteniendo la cantidad de UVs constante. Además, este elemento varía este throughput en tiempo de ejecución sin tener que detener la ejecución de la prueba.
Por lo tanto, el primer paso es agregar a nuestro script en JMeter uno de estos elementos. Además, para que el cambio pueda ser tomado ejecutando JMeter sin interfaz gráfica, se va a configurar el valor “Target throughput” como el parámetro “hits” con 100 por defecto, como se muestra a continuación:
El valor del throughput va a afectar al threadgroup por lo que todos los threads se verán afectados para lograr el objetivo.
Variar el Throughput en Ejecución
El siguiente paso será utilizar el Beanshell Server de JMeter. Este elemento provee la funcionalidad de actuar como un servidor, por lo cual, puede recibir solicitudes. Utilizaremos esto para modificar el parámetro “hits” definido en el paso anterior, en tiempo de ejecución. A continuación daremos los pasos para esto.
Habilitar Beanshell Server: para esto es necesario descomentar las siguientes líneas en el archivo jmeter.properties:
beanshell.server.port=9000 beanshell.server.file=../extras/startup.bsh
Luego, abrimos JMeter. Podemos validar que el Beanshell Server haya levantado correctamente mediante el comando:
netstat -an | find “9000”
Definir un archivo .bsh para modificar el parámetro “hits”. En este caso se creó una carpeta bsh\ dentro del home de JMeter y el archivo update_parameter.bsh con el siguiente contenido:
setprop(“hits”, args[0]);
Por último, para cambiar el parámetro dinámicamente, o sea, mientras la prueba se está ejecutando, invocar el siguiente comando (parados en el home de JMeter):
java -jar .\lib\bshclient.jar localhost 9000 .\bsh\update_parameter.bsh 10
En el comando anterior en primer lugar se invoca al cliente beanshell mediante el bshclient.jar para que se conecte a localhost en el puerto 9000, ubicación de nuestro beanshell server. Luego, el cliente beanshell ejecuta el archivo previamente definido, update_parameter.bsh, con el valor “10”. Esto ejecutará dentro del beanshell la función setprop, asignando “10” al parámetro “hits” resultando en controlar la prueba a 10 requests por minuto mediante el Constant Throughput Timer.
La siguiente imagen muestra la invocación del comando:
Luego de estos pasos se puede invocar en cualquier momento el comando del punto 3 para así cambiar el parámetro que controla los requests por minuto que JMeter ejecuta. Claro está que la prueba debe estar ejecutando en JMeter, ya sea por interfaz gráfica como por línea de comandos, para que el cambio se vea reflejado.