Aula 17 - Testes de Carga, Estresse e Performance 📈
Objetivo Pedagógico
Objetivo: Conceber e executar testes de carga, capacidade máxima (estresse), pico (spike) e resistência (soak) em sistemas distribuídos utilizando k6, analisando métricas de percentis (p95, p99), throughput (RPS) e thresholds.
📑 1. Fundamentos Teóricos & Análise Técnica
A qualidade de um sistema em escala de produção transcende a corretude funcional: sistemas que se degradam sob tráfego violam acordos de nível de serviço (Service Level Agreements - SLA).
A disciplina de Engenharia de Performance classifica os ensaios de carga em categorias com objetivos distintos: 1. Tipologias de Testes de Performance: - Teste de Carga (Load Testing): Avalia o comportamento do sistema sob volume esperado de usuários simultâneos em regime normal de operação. - Teste de Estresse (Stress Testing): Aumenta a carga progressivamente além dos limites projetados para descobrir o ponto de ruptura (Breaking Point) e avaliar se o sistema falha de forma graciosa (Graceful Degradation). - Teste de Pico (Spike Testing): Aplica uma onda súbita e massiva de requisições em segundos para testar a capacidade de auto-scaling e absorção rápida de tráfego. - Teste de Resistência (Soak / Endurance Testing): Mantém carga moderada por períodos extensos (horas ou dias) para diagnosticar vazamentos graduais de memória (Memory Leaks) e esgotamento de conexões em pool de banco de dados.
- Métricas Críticas de Observabilidade:
- A Falácia das Médias: O tempo médio de resposta mascara caudas de lentidão sofridas por usuários reais. A engenharia de confiabilidade utiliza Percentis: p95 (95% dos usuários responderam abaixo deste tempo) e p99 (o percentil 1% mais lento).
- Throughput e Taxa de Erro: Requisições por segundo (RPS) suportadas concomitantemente à manutenção da taxa de erro HTTP 5xx abaixo de limites rígidos (ex: < 0.1%).
📐 Arquitetura Conceitual & Diagrama de Fluxo
graph TD
k6["Motor k6 (Virtual Users - VUs)"] --> Ramping["Estágio de Ramp-Up (0 -> 500 VUs)"]
Ramping --> Plateau["Estágio de Platô de Carga (500 VUs por 5m)"]
Plateau --> Spike["Estágio de Pico (Spike para 2000 VUs)"]
Spike --> Metrics["Coleta de Métricas em Tempo Real"]
Metrics --> P95["Latência p95 < 200ms"]
Metrics --> P99["Latência p99 < 500ms"]
Metrics --> Err["Taxa de Erro < 0.5%"]
style k6 fill:#e1f5fe,stroke:#01579b
style Ramping fill:#fff3e0,stroke:#e65100
style Spike fill:#ffebee,stroke:#c62828
style P95 fill:#e8f5e9,stroke:#2e7d32
style P99 fill:#e8f5e9,stroke:#2e7d32 🔍 Pilares e Diretrizes Técnicas
Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Thresholds Declarativos (SLOs): Condições no script de teste que causam falha imediata no pipeline de CI se os percentis aceitáveis forem excedidos. - Virtual Users (VUs) Assíncronos: Arquitetura baseada em Go do k6 que executa milhares de VUs leves sem a sobrecarga de threads pesadas de ferramentas legadas. - Cenários de Chegada Realista (Open Models): Modelagem de tráfego que injeta requisições de forma independente da velocidade com que o servidor responde. - Identificação de Gargalos de Conexão: Diagnóstico de starvation de pools de threads, locks de banco de dados e saturação de socket TCP TIME_WAIT.
🛠️ 2. Implementação Prática em Engenharia de Performance e Testes com k6
Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:
// load_test_k6.js (Script de Teste de Carga com Thresholds de SLA em k6)
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
stages: [
{ duration: '30s', target: 50 }, // Ramp-up gradual para 50 VUs
{ duration: '1m', target: 200 }, // Carga constante de 200 VUs
{ duration: '20s', target: 500 }, // Spike súbito para 500 VUs
{ duration: '30s', target: 0 }, // Ramp-down para repouso
],
thresholds: {
http_req_duration: ['p(95)<300', 'p(99)<800'], // 95% das requisições devem responder em < 300ms
http_req_failed: ['rate<0.01'], // Menos de 1% de falhas permitidas
},
};
export default function () {
const params = {
headers: { 'Content-Type': 'application/json' },
};
const res = http.get('https://api.empresa.com/v1/produtos', params);
check(res, {
'status é 200': (r) => r.status === 200,
'tempo de resposta < 400ms': (r) => r.timings.duration < 400,
});
sleep(1); // Tempo de reflexão (think time) do usuário virtual
}
💡 Análise Passo a Passo do Código
- Estágios Multi-fase: Simula a evolução orgânica do tráfego corporativo desde o aquecimento até o pico de estresse.
- Thresholds como Quality Gates: Integra a validação de performance diretamente no pipeline de automação, quebrando o build caso o p95 ultrapasse 300ms.
- Validações com
check: Verifica a integridade funcional do payload da resposta simultaneamente à medição de latência.
🎯 3. Próximos Passos & Sequência Didática
-
Slides da Aula
-
Quiz de Fixação
-
Exercícios Práticos
-
Desafio de Projeto