Tests distribuidos mediante jMeter


Una instancia de jMeter puede controlar cualquier número de instancias remotas y colectar los resultados de cada una de ellas de este modo podremos realizar tests distribuidos a gran escala.

 

Cuando se realizan tests de este tipo hay que tener en cuenta que JMeter no distribuye la carga, el test correrá en su totalidad en todos los servidores remotos que le indiquemos. Si el test define 100 peticiones y se tienen 6 nodos se enviarán 600 peticiones al servidor final, además no será necesario copiar el fichero de test a cada servidor ya que el software se lo pasará a cada uno de los servidores de forma transparente.

Primero añadimos el usuario con el que ejecutaremos jMeter en cada servidor:

useradd jmeter
su jmeter -l

En cada uno de los servidores necesitaremos tener instalado el plugin de Selenium, lo mas sencillo es instalarlo en nuestro jMeter local, empaquetar el directorio una vez instalado y subirlo a los servidores pero si quisiesemos instalarlo manualmente, nos descargamos el gestor de plugins:

cd JMETER_HOME/lib/ext
wget https://jmeter-plugins.org/get/ -O jmeter-plugins-manager-1.3.jar

E instalamos el plugin Selenium/WebDriver siguiendo las instrucciones descritas en este enlace:

cd JMETER_HOME/lib/
wget http://search.maven.org/remotecontent?filepath=kg/apc/cmdrunner/2.2/cmdrunner-2.2.jar -O cmdrunner-2.2.jar
cd JMETER_HOME
java -cp JMETER_HOME/lib/ext/jmeter-plugins-manager-1.3.jar org.jmeterplugins.repository.PluginManagerCMDInstaller
JMETER_HOME/bin/PluginsManagerCMD.sh install jpgc-webdriver

Arrancamos jMeter en modo servidor en cada uno de los nodos, primero tenemos que hacer que el hostname resuelva a la ip WAN de cada servidor, consultamos su ip pública:

curl icanhazip.com

Como root editamos el fichero hosts:

su
vi /etc/hosts
IPWAN SERVERNAME

Instalamos chrome:

emerge -av www-client/google-chrome
exit

Deshabilitamos el SSL:

vi JMETER_HOME/bin/jmeter.properties
# Set this if you don't want to use SSL for RMI
server.rmi.ssl.disable=true

Nos bajaremos el chrome driver que corresponda con la versión instalada:

wget https://chromedriver.storage.googleapis.com/80.0.3987.106/chromedriver_linux64.zip
unzip chromedriver_linux64.zip

Arrancamos el servicio:

JMETER_HOME/bin/jmeter-server

Comprobamos que arranca sin problemas:

tail -f JMETER_HOME/bin/jmeter.log

Añadimos cada uno de los servidores en el cliente y deshabilitamos el ssl:

vi JMETER_HOME/bin/jmeter.properties
remote_hosts=kr0mtest,kr0mtest2,kr0mtest3,kr0mtest4
server.rmi.ssl.disable=true

Arrancamos jMeter y cambiamos el Path to Chrome Driver donde lo hayamos descomprimido en los servidores:

Comprobamos que podemos ejecutar el test en cualquiera de los servidores remotos:

Run -> Remote Start

Si el cliente está nateado dará problemas, he probado redirigiendo puertos per sin éxito, la mejor opción es crear el test gráficamente, pasarle el jmx a un servidor remoto y ejecutarlo desde allí­ ví­a CLI.

En el servidor no nateado indicamos los campos que se deben guardar en el log del test:

vi JMETER_HOME/bin/jmeter.properties
jmeter.save.saveservice.output_format=xml
jmeter.save.saveservice.data_type=true
jmeter.save.saveservice.label=true
jmeter.save.saveservice.response_code=true
jmeter.save.saveservice.response_data=true
jmeter.save.saveservice.response_data.on_error=true
jmeter.save.saveservice.response_message=true
jmeter.save.saveservice.successful=true
jmeter.save.saveservice.thread_name=true
jmeter.save.saveservice.time=true
jmeter.save.saveservice.subresults=true
jmeter.save.saveservice.assertions=true
jmeter.save.saveservice.latency=true
jmeter.save.saveservice.connect_time=true
jmeter.save.saveservice.samplerData=true
jmeter.save.saveservice.responseHeaders=true
jmeter.save.saveservice.requestHeaders=true
jmeter.save.saveservice.encoding=true
jmeter.save.saveservice.bytes=true
jmeter.save.saveservice.sent_bytes=true
jmeter.save.saveservice.url=true
jmeter.save.saveservice.filename=true
jmeter.save.saveservice.hostname=true
jmeter.save.saveservice.thread_counts=true
jmeter.save.saveservice.sample_count=true
jmeter.save.saveservice.idle_time=true

Ejecutamos el test indicando los servidores remotos:

JMETER_HOME/bin/jmeter -n -t Alfaexploit.jmx -Rkr0mtest2,kr0mtest3 -l log.xml

Luego desde nuestro jMeter local cargamos el fichero Alfaexploit.jmx y en el listener del test cargamos el fichero log.xml para poder visualizar los datos gráficamente.

NOTA: Sería conveniente proteger mediante reglas de firewall los servidores jMeter para evitar el uso por parte de usuarios no autorizados.


DEBUG:

Asegurarnos de que todos los procesos están arrancados con el usuario jMeter, en caso contrario los test fallarán ya que jMeter no permite su ejecución como root

Podemos arrancar los servidores en modo debug:

JMETER_HOME/bin/jmeter-server -Dsun.rmi.loader.logLevel=verbose 

El cliente también puede ser arrancado en modo debug:

JMETER_HOME/bin/jmeter -n -t Alfaexploit.jmx -l log.xml -Rkr0mtest2,kr0mtest3 -Dsun.rmi.loader.logLevel=verbose 

Si queremos habilitar el modo debug cuando ejecutamos los tests desde la interfaz gráfica debemos habilitar el nivel deseado en el propio test:

Antes de intentar ejecutar los test distribuidos podemos copiar manualmente el fichero de test a cada uno de los nodos y ejecutarlo por CLI para comprobar que puede correr sin problemas:

scp Alfaexploit.jmx SERVER:/home/jmeter/
ssh SERVER
JMETER_HOME/bin/jmeter -n -t Alfaexploit.jmx -l log.xml
Si te ha gustado el artículo puedes invitarme a un redbull aquí.
Si tienes cualquier pregunta siempre puedes enviarme un Email o escribir en el grupo de Telegram de AlfaExploit.
Autor: kr0m -- 15/03/2020 17:34:39 -- Categoria: Benchmarking