DevGuideTK

Testes de carga

Como descobrir o limite do sistema antes que os usuários descubram.

As decisões de um teste de carga são cinco: qual ferramenta, qual modelo de carga, qual cenário, onde rodar e como ler o resultado.

Qual ferramenta

FerramentaScripts emPontos fortes
k6JavaScriptModelos aberto e fechado, limites que reprovam o teste, saída para Prometheus e Grafana
GatlingScala, Java, Kotlin, JavaScriptRelatórios detalhados, modelo aberto por padrão
LocustPythonCenários com lógica complexa, interface web
JMeterInterface gráfica e XMLMuitos protocolos; mais pesado de manter
wrk2, vegeta, ohaLinha de comandoTaxa constante para um endereço, rápidos para medir um ponto
Serviços gerenciados (Grafana Cloud k6, Azure Load Testing, Gatling Enterprise)Os mesmos scriptsGerar carga de várias regiões, sem montar a infraestrutura

Para a maioria dos times, o k6 é um bom começo: o script é código, fica no repositório e roda na integração contínua. O que mais importa é usar uma ferramenta que suporte o modelo aberto.

Qual modelo de carga

ModeloQuando usarExecutor no k6
Aberto (taxa de chegada)Tráfego de usuários da internet, APIs públicasconstant-arrival-rate, ramping-arrival-rate
Fechado (usuários fixos)Um número fixo de clientes: trabalhadores, integrações com concorrência limitadaconstant-vus, ramping-vus

No teste do nível Conceito, contra um servidor com pausas de 1 segundo, o modelo fechado relatou p95 de 8 ms, e o aberto, 848 ms. Para tráfego de usuários, use o modelo aberto, ou, no mínimo, meça a latência a partir do instante em que o pedido deveria ter saído.

Qual cenário

DecisãoRecomendação
RotasA mistura real de tráfego, tirada dos logs ou das métricas: 70% leitura de produto, 20% busca, 10% compra, por exemplo
DadosVolume e distribuição de produção: muitos produtos, usuários diferentes, alguns muito populares
AutenticaçãoUsuários de teste diferentes; um só usuário concentra tudo num registro e esconde a disputa
AquecimentoDescartar o primeiro minuto: caches frios, compilação da JVM e do .NET, pools vazios
DuraçãoMinutos para carga e estresse; horas para resistência
DegrausSubir em degraus até passar do joelho; um ponto só não mostra a curva

Onde rodar

AmbienteVantagensCuidados
Uma cópia de produçãoO resultado vale para produçãoCusto; manter a cópia parecida
Ambiente de testes menorBarato; serve para comparar versõesO limite absoluto não vale; a tendência sim
Produção, fora do horário de picoO ambiente realRisco; tráfego de teste identificado; dados de teste isolados

E o gerador fora do alvo: na mesma máquina, os dois disputam CPU, e o gerador vira o gargalo. Nos testes deste tópico, o servidor ficou preso a um núcleo e o gerador, a outros quatro. Confira também se o próprio gerador não é o limite: CPU do gerador a 100% invalida o teste.

Como ler o resultado

SinalSignificado
Respostas por segundo param de crescer, a latência disparaPassou do joelho; a capacidade é a vazão onde isso começa (247/s no teste)
p50 estável, p99 subindoFila começando, pausas, ou disputa por um recurso
Erros por tempo esgotadoA fila ficou maior que o tempo limite
Latência subindo devagar ao longo de horasVazamento: memória, conexões, arquivos abertos
CPU baixa no servidor e latência altaEspera: banco, travas, pool de conexões, serviço externo

Durante o teste, observe o servidor ao mesmo tempo: CPU, memória, conexões do banco, tamanho das filas. O gerador diz que o sistema ficou lento; as métricas do servidor e um perfil, como mostra o tópico de profiling, dizem por quê.

Limites que reprovam o teste

Transforme os objetivos em limites automáticos e rode o teste na integração contínua para as rotas críticas:

export const options = {
  thresholds: {
    http_req_duration: ["p(95)<200", "p(99)<500"],  // em ms
    http_req_failed: ["rate<0.01"],                // menos de 1% de erros
  },
};

Assim, uma mudança que degrada o desempenho falha antes de ir para produção.

Resumo da decisão

  1. Uma ferramenta com modelo aberto, com o script no repositório.
  2. Taxa de chegada para simular usuários; medir sempre a partir do instante planejado.
  3. Percentis (p95, p99) e erros, nunca só a média.
  4. Degraus até passar do joelho, para conhecer a capacidade e o modo de falha.
  5. Dados e mistura de rotas realistas, com aquecimento e o gerador em outra máquina.
  6. Limites automáticos na integração contínua para as rotas críticas.

O próximo nível mostra um gerador de modelo aberto nas cinco linguagens e os scripts do k6 usados nos testes.

Prompts para aprofundar

Ao abrir no ChatGPT ou no Claude, o prompt é enviado ao serviço escolhido pela URL e também fica copiado na sua área de transferência.

  • Planejar o teste de carga do meu sistema

    Quero testar quanto o meu sistema aguenta antes de um evento de pico.
    
    Pergunte qual é o sistema, o tráfego esperado no pico, as rotas mais usadas, onde ele roda e se há um ambiente parecido com produção.
    
    Monte comigo o plano: a ferramenta, o modelo de carga, a mistura de rotas, os dados de teste, os degraus, a duração, o que observar no servidor durante o teste e os critérios de aprovação.
  • Escolher a ferramenta de teste de carga

    Estou escolhendo uma ferramenta de teste de carga.
    
    Pergunte qual linguagem o time conhece, que protocolos preciso testar, se o teste vai rodar na integração contínua e se preciso gerar carga de várias regiões.
    
    Compare para o meu caso k6, Gatling, Locust, JMeter e uma ferramenta simples como vegeta ou oha, inclusive quanto ao suporte ao modelo aberto. Recomende uma.
  • Testes de carga na integração contínua

    Quero rodar testes de carga automaticamente para pegar regressões de desempenho.
    
    Pergunte qual serviço de integração contínua e ferramenta eu uso, e quais rotas são críticas.
    
    Me ajude a montar: um teste curto com limites que reprovam o pipeline, o ambiente onde ele roda, como lidar com a variação entre execuções, onde guardar o histórico dos resultados e quando rodar o teste completo.