Execução distribuída de JMeter (rede local)
Tabela de conteúdos
intermediário - This article is part of a series.
Uma das principais características do JMeter é o execução distribuída, que permite escala horizontal de número de [geradores de carga]. Embora seja uma característica menos conhecida, é extremamente útil ou eficaz quando precisamos executar apenas milhares de threads ou usuários virtuais.
Por que é pouco conhecido? #
Realmente é pouco conhecido porque existem empresas especializadas que oferecem essa automação em nuvem como Flood.io, Blazemeter e Octoperf entre outros. Além disso, pode ser um trabalho laborioso que consuma muito tempo; seria necessário avaliar o benefício da implementação dessa estratégia para algum caso particular.
Quando é prudente iniciar o esforço? #
Se você precisar realizar uma carga ou teste de estresse entre 2.000 e 8.000 threads ou usuários virtuais, recomendo usar essa abordagem. Acima disso, não recomendaria isso porque criar, clonar, configurar e monitorar geradores de cargas, especialmente se é uma pessoa responsável por todas essas tarefas, pode levar muito tempo, mesmo que você seja o único responsável por elas. Para execuções acima de 8K, sugiro pesquisar opções de teste de carga na nuvem como mencionamos anteriormente ou também usar contêineres, que serão parte desta série de posts sobre testes distribuídos com JMeter.
Como funciona? #
Ele opera em modo master-slave, o que significa que precisamos de um nó ou servidor como controller/orchestrador e os demais servidores seriam nós/injectores de carga ( generadores de carga). Este esquema funciona apenas dentro da mesma rede, o que significa que teríamos que subneter para todos os dispositivos se conectarem. Sem mais delongas, vamos ver o que precisamos:
- Controlador, também chamado de Master ou Orquestrador (Windows) x 1
- Filtro de Firewall desativado
- Java 1.8+
- JMeter 5.2.1
- Node, também conhecido como Generador de carga ou Injetor de carga (Linux Ubuntu) x 4
- Java 1.8+
- JMeter 5.2.1
A versão do JMeter 5.2.1 deve ser a mesma em todos os máquinas, o nível de Java é diferente no nó mestre em comparação com os nós, mas é recomendado usar a mesma versão de Java em todas as máquinas.
Receita para cozinhar #
1.- Filtro de Portas - Controlador #
Precisamos desabilitar o firewall do Windows para permitir a conexão bidirecional entre o mestre e os nós. Escolha o Windows Server 2019 para este exemplo porque é mais fácil mostrar a execução no ambiente gráfico, embora você também possa usar uma GUI Linux. É possível fazer isso tanto pelo CLI quanto por meio de um script que eu fornecerá como seria extremamente útil se não houver uma interface gráfica ou para aqueles que adoram CLI (Interfaz de Linha de Comando).
2.- Java - Controller #
Instale o JDK 1.8+ para este exemplo, usei o JRE 1.8, você pode baixar a versão mais recente de Java aqui.
3.- JMeter - Controle #
Baixe e instale JMeter 5.2.1 (a versão mais recente conhecida até esta publicação), se você tiver dúvidas, veja este publicação. Se precisar de plugins ou arquivos de dados (CSV ou imagens), será necessário instalá-los manualmente em cada gerador de testes de carga, pois estes arquivos não são transmitidos via RMI.
4.- Propriedades - Controlador #
Edit the file jmeter.properties to add the IP addresses of remote hosts or nodes (see step #6) and also to disable RMI security. This is a more lengthy process, but we’ll start with the simpler path first.
#remote_hosts=127.0.0.1 //original
remote_hosts=10.223.2.71,10.223.2.78,10.223.2.63,10.223.2.58 //editada
#server.rmi.ssl.disable=false //original
server.rmi.ssl.disable=true //editada
5.- Java - Nodos #
Instale Java 1.8+ em cada nó, mesmo que você esteja usando serviços de nuvem, recomendo fazer isso uma vez e criar uma imagem para gerar os outros servidores a partir dessa imagem. Embora em qualquer caso você precisará verificar as seguintes etapas para cada um dos nós. Para esse exemplo, usei Linux Ubuntu, aqui está um recepto para instalação.
6.- JMeter - Nodos #
Baixe e instale JMeter 5.2.1 (a versão mais recente conhecida até esta publicação), se você tiver dúvidas, você pode ver este publicação. Podemos usar um simples wget para baixar o arquivo tarball, para descompactá-lo podemos usar a comando tar.
wget https://downloads.apache.org//jmeter/binaries/apache-jmeter-5.2.1.tgz
tar -xvf apache-jmeter-5.2.1.tgz
7.- Endereço IP - Nodos #
Para obter a IP de cada servidor de nodo para inserção na etapa #4, parece ser recursivo, mas este valor é necessário para as etapas #4 e #9. A maneira mais simples de obter o valor é usando o comando ifconfig, conforme mostrado abaixo:
O endereço IP seria: 10.223.2.71
8.- Propriedades - Nó #
Edit the file jmeter.properties em todos os nós para desabilitar a segurança RMI. Como já mencionado, é um processo mais longo para permitir a segurança, mas dado que estamos em uma rede local, não deveria ser necessário.
#server.rmi.ssl.disable=false //original
server.rmi.ssl.disable=true //editada
9.- Edit JMeter Service - Controller #
Edit the file jmeter-server, this file contains the configuration of the JMeter service for remote host or node mode, that is, we must configure the internal network IP address of the node so it can receive requests from the master or controller.
#RMI_HOST_DEF=-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx //original
RMI_HOST_DEF=-Djava.rmi.server.hostname=10.223.2.71 //editada
10.- Iniciar o serviço JMeter - Controle #
Inicie o serviço jmeter-server
, este serviço precisa ser executado para que a máquina possa escutar comandos do nó mestre. Recomendo usar nohup
e rodar em segundo plano com &
. Se você perder conexão ao nó via SSH, mas o serviço continua funcionando, algo como:
nohup ./jmeter-server &
tail -f nohup.out
no final, recomendo monitorar o arquivo de saída do sessão através do SSH com a comando tail
.
11.- Execução - Controlador #
Antes de configurar e ouvir os nós, esses serão visíveis ao master ou gerenciador. Neste exemplo, use um script com carga mínima, apenas 10 threads. Deve-se notar que há 10 threads por gerador, resultando em execução paralela de 40 threads.
12. Validação #
Verifique que os nós estão recebendo comunicação do mestre e executando o script.
Eu espero que eles tenham reproduzido essa situação. Se não, verifique se todos os nós e o mestre estão dentro da mesma rede. No exemplo, eles estão na rede 10.223.2.0/24. Se usar AWS ou Azure, certifique-se de estar dentro do mesmo subdomínio e VPC. Eu publicarei como vemos essas respostas em Grafana em breve.
Para concluir, deixarei você com a execução no comando linha de comando.
jmeter.bat -n -t script.jmx -R 10.223.2.71,10.223.2.78,10.223.2.63,10.223.2.58
Conclusão #
Este funciona bem em Azure e AWS, que são os maiores provedores de IaaS na nuvem, não testei neles mas imagino que também funcionaria com Google. Como você pode ver aqui, continuamos com tarefas manuais que precisam ser avaliadas baseada em análises de custo-benefício devido a essas tarefas podem levar algum tempo para melhorar as habilidades e acima tudo falhar um pouco para ver possíveis obstáculos onde poderíamos nos atrapalhar. Não hesite em entrar em contato conosco se precisar de ajuda.