Pular para conteúdo

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.

  1. Métricas Críticas de Observabilidade:
  2. 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).
  3. 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

  1. Estágios Multi-fase: Simula a evolução orgânica do tráfego corporativo desde o aquecimento até o pico de estresse.
  2. Thresholds como Quality Gates: Integra a validação de performance diretamente no pipeline de automação, quebrando o build caso o p95 ultrapasse 300ms.
  3. 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