Case de testes de exaustão em Typescript e NodeJS em uma instância na AWS.
Desenvolvida em 2007 pela Apache, o JMeter é uma ferramenta utilizada para a realização de testes de performance. Escrita em Java, gratuita, de código aberto, com o objetivo na simulação de diversos tipos de testes:
- Teste de carga;
- Teste de estresse;
- Teste de escalabilidade;
- Teste de pico;
- Teste de resistência;
- Teste de concorrência;
- Teste de capacidade.
O JMeter foi desenvolvido para testar aplicações Web. No entanto, com o tempo a tecnologia foi aprimorada e já é possível utilizá-la para testes em diferentes serviços:
- Requisições HTTP, SOAP ou FTP;
- Bancos de dados;
- servidores de e-mail, etc.
Um teste de performance analisa como uma determinada aplicação se comporta quando ela é submetida a uma carga exaustiva de requisições, indicando se existe algum problema na aplicação ou na infra estrutura de hospedagem.
* A versão do JMeter utilizada para os testes é a 5.4.1.
O devido tutorial foi desenvolvido com base em um ambiente linux, utilizando o Ubuntu na versão 18.04.5 LTS.
$ lsb_release -a
LSB Version: core-9.20170808ubuntu1-noarch:...
Distributor ID: Ubuntu
Description: Ubuntu 18.04.5 LTS
Release: 18.04
Codename: bionic
❗ Importante!
Para executar o JMeter é necessário possuir a JVM instalada em seu computador, se você ainda não possui, clique aqui para ir para documentação. Utilizando a versão 14.
$ java -version
java version "14.0.2" 2020-07-14
Java(TM) SE Runtime Environment (build 14.0.2+12-46)
Java HotSpot(TM) 64-Bit Server VM (build 14.0.2+12-46, mixed mode, sharing)
👉 Link para o download do JMeter
# Para abrir o programa:
$ cd apache-jmeter-5.4.1/bin/
# Em seguida:
$ ./jmeter
Pronto! Essa é a tela do JMeter na versão 5.4.1.
O principal objetivo do teste é estressar a aplicação e o servidor e verificar quantas solicitações http simultâneas o servidor é capaz de suportar, como também o melhor caso e o caso médio de requisições.
❗ Iremos estressar até o ponto que o servidor venha a travar.
❗ É indicado utilizar a ferramenta apenas em ambientes controlados, em caso de uso indevido da ferramenta em servidores não autorizados, pode ocasionar em infrações legais para o requisitante, a ferramenta deve ser utilizada de forma responsável.
Na Amazon AWS, em uma única instância, será configurada uma aplicação em NodeJs que ficará escutando na porta 3000, cuja a única finalidade consiste em: ao ser solictada uma URL, a aplicação irá inserir um registro em um banco de dados (Postgres).
- id (gerado pelo sistema, UUID)
- name (Tiago Rizzo, dado fixo)
- email (tiagorizzo@gmail.com, dado fixo)
- created_at (gerado pelo postgres)
A instância na AWS que irá receber a aplicação conterá as seguintes configurações:
- Ubuntu 18.04;
- 1 núcleo de processamento;
- 1gb de ram;
- SSD 20gb.
No cliente, será utilizado o JMeter na versão 5.4.1 para realizar as requisições HTTP.
❗ Os parametros de desempenho serão coletados e expostos logo a baixo na sequência de passo a passo.
Já com o JMeter aberto...
1 - Adicione o grupo:
Clique com o botão direito sobre Test Plan > Add > Threads (Users) > Thread Group
Na opção Numbers of Threads (users): 10
❗ Na máquina do cliente, será provisionado 10 threads para executar as requisições simultâneas, importante ter cuidado na quantidade de threads, pois, dependendo da quantidade escolhida em relação aos recursos de processamento, pode travar o sistema operacional.
2 - Adicione o testador HTTP:
Clique com o botão direito sobre Test Group > Add > Sampler > HTTP Request
No campo Protocol [HTTP]: http
No campo Server Name or IP: ip_do_seu_servidor_de_aplicação
No campo Port Number: 80
3 - Adicione o ouvinte (Relatórios):
Clique com o botão direito sobre Test Plan > Add > Listener > View Results in Table
4 - Rodando o teste:
Clique no ícone de play, circulado na imagem a baixo para rodar os testes.
❗ Será solicitado o caminho para salvar o arquivo de configurações do teste.
Teste 1
- 50 requisições de usuários simultâneos;
- Cada requisição com 10 iterações.
Resultado:
- A máquina demandou menos de 1% dos recursos de processamento;
- 500 registros foram adicionados no banco de dados postgres.
Teste 2
- 150 requisições de usuários simultâneos;
- Cada requisição com 10 iterações.
Resultado:
- A máquina demandou 24% dos recursos de processamento;
- 1500 registros foram adicionados no banco de dados postgres.
Teste 3
- 300 requisições de usuários simultâneos;
- Cada requisição com 10 iterações.
Resultado:
- A máquina demandou 35% dos recursos de processamento;
- 3000 registros foram adicionados no banco de dados postgres.
Teste 4
- 400 requisições de usuários simultâneos;
- Cada requisição com 15 iterações.
Resultado:
- A máquina demandou 75% dos recursos de processamento;
- 6000 registros foram adicionados no banco de dados postgres.
1 - Podemos notar a eficiência do NodeJs em receber alto volume de requisições e performar muito bem;
2 - O melhor cenário foi 300 conexões simultâneas, onde os recursos ficariam processando em 35% da capacidade total.
Edivam Enéas de Almeida Júnior