Feather Background Waves Background
Ir para o conteúdo principal
Feather Background Waves Background
Feather Background Waves Background
  1. JMeter em Português/

Execução distribuída de JMeter (rede local)

intermediário - This article is part of a series.

distributed

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?>

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?>

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?>

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>

Receita para cozinhar #

1.- Filtro de Portas - Controlador>

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).

firewall

2.- Java - Controller>

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.

java

3.- JMeter - Controle>

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>

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>

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.

linux

6.- JMeter - Nodos>

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>

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

ifconfig

8.- Propriedades - Nó>

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>

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>

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.

monitoring

11.- Execução - Controlador>

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.

nodes

start

12. Validação>

12. Validação #

Verifique que os nós estão recebendo comunicação do mestre e executando o script.

jmeter-log

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

cli

Conclusão>

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.



intermediário - This article is part of a series.