Blog

Teste de carga que mente: por que o ensaio passa e a produção cai no mesmo volume

O relatório do ensaio dizia mil requisições por segundo com latência mediana de quarenta e dois milissegundos e nenhum erro, e o time aprovou a campanha com folga confortável. Três dias depois, com novecentas requisições por segundo medidas no mesmo painel, o serviço começou a devolver erro aos onze minutos de tráfego e não se recuperou sozinho. Ninguém tinha mentido no relatório: o ensaio realmente passou naquele volume. O problema é que volume é a variável menos importante de um teste de carga, e é a única que a maioria dos ensaios controla. Este artigo mostra por que o gerador de carga de laço fechado mede algo diferente do que produção entrega e por que ele esconde exatamente a falha que você quer encontrar, por que a média e a mediana são cegas para o modo de falha que importa e qual estatística substitui as duas, quais seis diferenças entre ensaio e produção transformam o mesmo número em resultados opostos, por que a duração do teste é um parâmetro de descoberta e não de conforto, como construir um gerador de laço aberto com correção de omissão coordenada em poucas linhas, qual é o critério de aprovação que substitui o limiar de latência que todo mundo usa, e como encontrar o ponto de saturação em vez de apenas confirmar um número que alguém escolheu antes.

2026-09-18 / Arquitetura / 18 min

01

O gerador de laço fechado responde a uma pergunta que ninguém fez

Quase toda ferramenta de teste de carga em uso hoje funciona no mesmo modelo: um número fixo de trabalhadores virtuais, cada um em um laço que envia uma requisição, espera a resposta chegar, opcionalmente pausa por um tempo de reflexão e envia a próxima. Cinquenta trabalhadores com uma resposta de cinquenta milissegundos produzem mil requisições por segundo. É simples de implementar, simples de explicar e é o que a maioria dos relatórios chama de carga.

O problema aparece quando o serviço fica lento. Se a resposta passa de cinquenta para quinhentos milissegundos, cada trabalhador passa a enviar dez vezes menos requisições, e a carga aplicada cai de mil para cem requisições por segundo sozinha, sem que ninguém peça. O gerador reduziu a pressão exatamente no instante em que o serviço estava em dificuldade. O resultado é um ensaio que nunca consegue empurrar um sistema degradado para o colapso, porque ele é, por construção, gentil com sistemas lentos.

Produção não faz isso. O usuário que abre o aplicativo não espera o anterior terminar para clicar, e o parceiro que dispara webhook não reduz a frequência porque a sua resposta demorou. A chegada é independente do serviço, e é esse desacoplamento que produz filas, e são filas que produzem timeouts, esgotamento de pool e a espiral de retry que derruba o serviço. O laço fechado mede capacidade sob autocontrole; produção aplica carga sob indiferença. São duas perguntas diferentes, e o relatório responde à errada.

LACO FECHADO x LACO ABERTO SOB DEGRADACAO

  servico saudavel (50ms)         servico degradado (500ms)

  FECHADO  50 trabalhadores       FECHADO  50 trabalhadores
           1.000 req/s aplicadas           100 req/s aplicadas
           fila = 0                        fila = 0
           "passou"                        "passou, so mais lento"

  ABERTO   1.000 req/s agendadas  ABERTO   1.000 req/s agendadas
           1.000 req/s aplicadas           1.000 req/s aplicadas
           fila = 0                        fila cresce 900/s
                                           timeout, pool cheio, colapso

  O laco fechado converte degradacao em menos carga.
  O laco aberto converte degradacao em fila, que e o que
  produção faz. So o segundo encontra o ponto de ruptura.

Há um caso em que o laço fechado é o modelo correto, e vale reconhecê-lo para não trocar um erro por outro: quando a população de clientes é fechada e cada cliente realmente espera. Um sistema interno com duzentos operadores de call center, cada um trabalhando em uma tela por vez, é um sistema de laço fechado de verdade, e modelá-lo como laço aberto superestima a carga de pico. A regra prática é perguntar se um cliente lento reduz a chegada de novos pedidos. Se reduz, laço fechado. Se não reduz, e quase nunca reduz em serviços expostos a internet, o modelo correto é o aberto.

02

Omissão coordenada: o número que some do relatório é justamente o ruim

A consequência estatística do laço fechado tem nome, e o nome é omissão coordenada. Suponha um ensaio de mil requisições por segundo durante cem segundos, com noventa e nove segundos de respostas em um milissegundo e uma pausa de um segundo em que o serviço não respondeu nada. No laço fechado, durante essa pausa os trabalhadores ficaram parados, e portanto quase nenhuma requisição foi registrada nela. O relatório sai com noventa e nove mil medições de um milissegundo e algumas dezenas de um segundo, e o percentil noventa e nove fica em torno de um milissegundo.

A realidade de um sistema de laço aberto é outra. Durante aquela pausa de um segundo, mil requisições deveriam ter sido enviadas e todas elas teriam sofrido espera. A primeira esperaria um segundo inteiro, a segunda novecentos e noventa e nove milissegundos, e assim por diante. Essas mil medições não aparecem no relatório porque o gerador nunca as emitiu: ele coordenou o próprio silêncio com o silêncio do serviço. O percentil noventa e nove verdadeiro é de centenas de milissegundos, e o relatório anuncia um.

A correção não exige trocar de ferramenta, exige mudar o que se mede. Em vez de cronometrar o tempo entre o envio efetivo e a resposta, cronometra-se o tempo entre o instante em que a requisição deveria ter sido enviada, segundo o cronograma definido no início do ensaio, e a resposta. A diferença entre os dois é a espera na fila do próprio gerador, que é exatamente a espera que o usuário real sofre quando o sistema não acompanha.

Cenário do ensaioLatência reportada pelo laço fechadoLatência real em laço abertoO que a diferença esconde
Pausa de coleta de lixo de 800ms a cada 30sPercentil 99 em 12msPercentil 99 em 640msToda a cauda que define a experiência do usuário
Reeleição de líder do banco por 4sMediana e percentil 99 quase inalteradosPercentil 95 acima do timeout do clienteA avalanche de retry que vem logo depois
Serviço a montante degrada de 40ms para 900msCarga aplicada cai sozinha para 1/20Fila cresce e o pool esgota em 2 minutosO modo de falha inteiro, que nunca é atingido
Reinício de uma réplica de trêsPequeno aumento de latência médiaUm terço das requisições sem destino por 15sA ausência de nova tentativa no cliente
Limite de taxa do provedor externo em 300 req/sTaxa aplicada se acomoda em 300 req/sFila interna cresce de forma ilimitadaQue o ensaio nunca testou o comportamento acima do teto

A segunda linha da tabela merece atenção porque descreve o incidente mais comum de todos. Uma reeleição de líder de quatro segundos é um evento normal e esperado, que acontece em todo failover planejado. No ensaio de laço fechado ela é absorvida silenciosamente e nem entra no relatório. Em produção ela produz quatro segundos de requisições acumuladas que estouram o timeout do cliente, e o cliente reenvia todas elas de uma vez no quinto segundo, dobrando a carga exatamente no instante em que o novo líder está frio. O ensaio aprovou o volume e nunca chegou perto de testar o evento.

03

As seis diferenças que fazem o mesmo número dar resultados opostos

Quando o ensaio aprova mil requisições por segundo e produção cai em novecentas, a tentação é concluir que o gerador estava errado sobre o número. Em geral não estava: o número é o mesmo, e o que difere é o que acompanha o número. Seis diferenças respondem pela maior parte dos casos, e todas elas são verificáveis antes do próximo ensaio.

  1. Distribuição de chegada. O gerador emite uma requisição a cada milissegundo com régua; produção chega em processo de Poisson, onde intervalos curtos se agrupam. Com a mesma média de mil por segundo, o pico instantâneo de um segundo qualquer em Poisson passa de mil e cem com frequência, e é o pico que satura a fila, não a média.
  2. Cardinalidade dos dados. O ensaio repete cem identificadores de cliente e aquece o cache a ponto de a taxa de acerto chegar a noventa e nove por cento. Produção tem duzentos mil clientes distintos e a taxa de acerto real é de sessenta por cento, o que multiplica por quatro as consultas que chegam ao banco com o mesmo número de requisições na borda.
  3. Distribuição do trabalho por requisição. O ensaio usa o mesmo corpo de requisição sempre, quase sempre o caso pequeno. Produção tem uma cauda de requisições que custam trinta vezes mais, e é essa cauda que ocupa os trabalhadores e forma a fila para todo o resto.
  4. Estado acumulado. O ensaio roda em base recém-restaurada, com índices compactos, estatísticas recentes e nenhuma linha morta. Produção tem seis meses de crescimento, e o mesmo plano de consulta escolhido no ensaio pode nem ser o plano escolhido lá.
  5. Concorrência com o resto do mundo. Durante o ensaio o serviço tem o banco só para si. Em produção ele divide com o processo de relatório noturno, com a replicação, com o trabalho em lote das oito da manhã e com o backup, e a capacidade disponível é o que sobra, não o total.
  6. Ausência dos vizinhos degradados. O ensaio usa dependências saudáveis e locais. Produção tem um provedor externo que oscila, um serviço interno que reinicia, uma resolução de nome que ocasionalmente demora, e cada um deles transforma capacidade em fila.

Das seis, a primeira é a que se corrige com menos esforço e tem o maior retorno imediato, porque é uma mudança de três linhas no gerador. Emitir com intervalo constante é um erro silencioso: ele reduz a variância da chegada a zero e, com isso, remove o principal mecanismo de formação de fila. Trocar o intervalo constante por um intervalo exponencial, que é o que gera um processo de Poisson, mantém a mesma taxa média e devolve ao ensaio o agrupamento que produção tem.

// Gerador de laco aberto com chegada de Poisson e correcao de
// omissao coordenada. O ponto central e o campo previsto: a medicao
// comeca no instante agendado, nao no instante do envio.

/**
 * @param {object} opcoes
 * @param {string} opcoes.url        endpoint sob teste
 * @param {number} opcoes.taxaPorSeg taxa media de chegada desejada
 * @param {number} opcoes.duracaoSeg duracao total do ensaio
 * @param {number} opcoes.timeoutMs  timeout por requisicao
 */
export async function ensaioLacoAberto({ url, taxaPorSeg, duracaoSeg, timeoutMs = 2000 }) {
  const medicoes = [];
  const emVoo = new Set();
  const inicio = performance.now();
  const fim = inicio + duracaoSeg * 1000;

  // Intervalo exponencial: reproduz chegada de Poisson, onde a media e
  // 1/taxa mas os intervalos se agrupam. Intervalo constante remove a
  // variancia da chegada e, com ela, a formacao de fila que se quer medir.
  const proximoIntervaloMs = () => (-Math.log(1 - Math.random()) / taxaPorSeg) * 1000;

  let previsto = inicio;

  while (previsto < fim) {
    previsto += proximoIntervaloMs();
    const agendadoPara = previsto;

    const esperaMs = agendadoPara - performance.now();
    // Espera apenas quando o gerador esta adiantado. Quando esta atrasado
    // o valor e negativo e a requisicao sai imediatamente, ja devendo
    // tempo: esse debito e a omissao coordenada tornada visivel.
    if (esperaMs > 0) {
      await new Promise((resolve) => setTimeout(resolve, esperaMs));
    }

    const promessa = medirUma({ url, agendadoPara, timeoutMs })
      .then((medicao) => medicoes.push(medicao))
      .finally(() => emVoo.delete(promessa));

    emVoo.add(promessa);
  }

  await Promise.all(emVoo);
  return resumir(medicoes, duracaoSeg);
}

async function medirUma({ url, agendadoPara, timeoutMs }) {
  const enviadoEm = performance.now();
  const controlador = new AbortController();
  const alarme = setTimeout(() => controlador.abort(), timeoutMs);

  try {
    const resposta = await fetch(url, { signal: controlador.signal });
    const concluidoEm = performance.now();
    return {
      // Servico: o que o painel do servidor enxerga.
      servicoMs: concluidoEm - enviadoEm,
      // Resposta: o que o usuario sente, incluindo a espera na fila do
      // proprio gerador. A diferenca entre os dois e a omissao coordenada.
      respostaMs: concluidoEm - agendadoPara,
      status: resposta.status,
      ok: resposta.ok,
    };
  } catch {
    const concluidoEm = performance.now();
    return {
      servicoMs: concluidoEm - enviadoEm,
      respostaMs: concluidoEm - agendadoPara,
      status: 0,
      ok: false,
    };
  } finally {
    clearTimeout(alarme);
  }
}

function percentil(valores, p) {
  if (!valores.length) return 0;
  const ordenado = [...valores].sort((a, b) => a - b);
  const indice = Math.min(ordenado.length - 1, Math.ceil((p / 100) * ordenado.length) - 1);
  return ordenado[indice];
}

function resumir(medicoes, duracaoSeg) {
  const servico = medicoes.map((m) => m.servicoMs);
  const resposta = medicoes.map((m) => m.respostaMs);
  const erros = medicoes.filter((m) => !m.ok).length;

  return {
    amostras: medicoes.length,
    taxaEfetiva: medicoes.length / duracaoSeg,
    taxaErro: erros / Math.max(1, medicoes.length),
    servicoP99: percentil(servico, 99),
    respostaP99: percentil(resposta, 99),
    // A razao abaixo e o indicador mais importante do relatorio inteiro.
    // Perto de 1 o gerador acompanhou o cronograma. Acima de 2 existe
    // fila no gerador, e qualquer numero de latencia do servidor esta
    // subestimando o que o usuario sofre por esse mesmo fator.
    fatorDeOmissao: percentil(resposta, 99) / Math.max(1, percentil(servico, 99)),
  };
}

O campo mais valioso do resumo é o último. A razão entre o percentil noventa e nove da resposta e o percentil noventa e nove do serviço responde, em um único número, se o ensaio pode ser levado a sério. Um valor próximo de um significa que o gerador conseguiu manter o cronograma e que o número de latência do servidor é confiável. Um valor de cinco significa que o gerador acumulou fila, que o servidor já estava saturado durante boa parte do ensaio, e que o percentil bonito do painel do servidor está subestimando a experiência real por um fator de cinco.

04

Duração e formato: o ensaio de cinco minutos aprova o que falha em quarenta

Existe uma classe inteira de falhas que é invisível por construção em ensaios curtos, porque o tempo até a manifestação é maior do que a duração do teste. Elas não são exóticas nem raras: são as mais comuns em incidentes de produção, e todas têm em comum o consumo progressivo de um recurso finito que o ensaio curto mal chega a arranhar.

FalhaTempo típico até manifestarPor que o ensaio curto não vêComo provocá-la no ensaio
Vazamento de conexão em caminho de erro30 a 90 minutosO caminho de erro quase não é exercitado em ensaio felizInjetar de 2 a 5 por cento de falha nas dependências durante 60 minutos
Esgotamento de porta efêmera de saída20 a 60 minutosO estoque de portas é grande e o consumo é linearManter taxa acima da sustentável por pelo menos 45 minutos
Fragmentação de memória e pausas crescentes2 a 6 horasA memória estabiliza antes do primeiro ciclo completoEnsaio de resistência com carga moderada e perfil de objeto realista
Inchaço de índice e mudança de plano de consultaDias em produçãoA base do ensaio é recém-restaurada e compactaRestaurar cópia de produção em vez de gerar dados sintéticos
Acúmulo em fila com consumidor levemente mais lento15 a 120 minutosUm déficit de 3 por cento leva horas para virar atraso visívelComparar taxa de produção e de consumo, não o tamanho da fila

A terceira coluna revela o padrão comum: o ensaio curto não é pequeno demais para a carga, é curto demais para o mecanismo. Um vazamento de dez conexões por minuto precisa de uma hora para consumir um pool de seiscentas, e o ensaio de cinco minutos observa sessenta conexões vazadas, que é indistinguível de operação normal em qualquer painel. Aumentar a carga não ajuda: é preciso aumentar o tempo, ou provocar diretamente o caminho que vaza.

Isso leva a uma divisão de formatos que vale adotar explicitamente, porque cada um encontra uma classe diferente de defeito e nenhum substitui os outros. O ensaio de degrau sobe a carga em patamares até encontrar o ponto de saturação, e responde qual é a capacidade. O ensaio de rajada aplica um salto instantâneo de três a cinco vezes durante trinta segundos, e responde se o sistema absorve pico sem espiral de retry. O ensaio de resistência mantém setenta por cento da capacidade por horas, e responde se existe vazamento. O ensaio de caos aplica carga normal enquanto derruba dependências, e responde se o modo degradado funciona. Aprovar um lançamento com apenas o primeiro é aprovar apenas contra uma das quatro classes de falha.

QUATRO FORMATOS, QUATRO PERGUNTAS DIFERENTES

  DEGRAU        carga
                 |      ___----- ponto de saturacao
                 |  __--
                 |--          pergunta: qual e a capacidade?
                 +---------------- tempo (20 a 40 min)

  RAJADA        carga
                 |    ____
                 |    |  |      pergunta: absorve pico sem
                 |____|  |____  espiral de retry?
                 +---------------- tempo (5 min, salto de 30s)

  RESISTENCIA   carga
                 |________________
                 |                pergunta: vaza algum recurso?
                 +---------------- tempo (2 a 8 horas, 70% da cap.)

  CAOS          carga + falhas injetadas
                 |____X____X______  X = dependencia derrubada
                 |                pergunta: o modo degradado existe?
                 +---------------- tempo (30 a 60 min)

05

O critério de aprovação precisa ser um ponto de saturação, não um limiar

O critério mais usado em teste de carga é também o menos informativo: percentil noventa e cinco abaixo de duzentos milissegundos e taxa de erro abaixo de um por cento na carga alvo. Ele tem dois defeitos estruturais. O primeiro é que ele valida um ponto e não uma curva, então ele não diz absolutamente nada sobre o que acontece com cinco por cento a mais de tráfego, que é a pergunta que interessa na véspera da campanha. O segundo é que ele confunde estar dentro do limite com ter margem, e um sistema que atende ao critério a dois por cento do ponto de ruptura passa exatamente como um que está a cinquenta.

O critério que substitui os dois é o ponto de saturação e a margem até ele. O ponto de saturação é a taxa de chegada acima da qual a vazão útil para de crescer enquanto a latência começa a subir de forma não linear. Ele não é uma escolha, é uma propriedade do sistema, e encontrá-lo é o objetivo do ensaio de degrau. A margem é a razão entre o ponto de saturação e o pico real observado em produção nos últimos noventa dias, e é esse número, e não o percentil, que deve constar do relatório de aprovação.

IndicadorO que ele medeFaixa saudávelO que uma leitura ruim indica
Ponto de saturaçãoTaxa de chegada onde a vazão para de crescerAcima de 2 vezes o pico de produçãoAbaixo de 1,5 vez, um evento sazonal comum derruba o serviço
Fator de omissãoRazão entre percentil 99 de resposta e de serviçoAbaixo de 1,3Acima de 2, o número do servidor está subestimando a experiência
Vazão útil no colapsoVazão de sucesso a 150 por cento da saturaçãoAcima de 70 por cento da vazão de picoAbaixo de 40 por cento, falta controle de admissão ou de fila
Tempo até recuperarSegundos entre o fim da rajada e o retorno ao normalAbaixo de 60 segundosAcima de 5 minutos, existe retry sem limite ou fila sem teto
Deriva de recurso na resistênciaInclinação de memória e conexões por horaPraticamente planaQualquer inclinação positiva sustentada é vazamento

A terceira linha é a que mais muda a conversa com produto, porque ela mede o que acontece depois do limite e não antes dele. Todo sistema tem um ponto de saturação, e nenhum orçamento evita que ele exista; o que diferencia um serviço resiliente de um frágil é o formato da curva depois dele. Um sistema com controle de admissão recusa o excedente rapidamente e mantém setenta por cento da vazão de pico, o que significa que sete em cada dez clientes continuam sendo atendidos. Um sistema sem controle aceita tudo, forma fila, estoura timeout em todas as requisições e entrega vazão útil próxima de zero, atendendo ninguém enquanto trabalha no limite. Os dois têm a mesma capacidade nominal e resultados opostos no dia do pico.

Vale registrar também o efeito prático dessa mudança de critério no processo. Um relatório que diz percentil noventa e cinco em cento e oitenta milissegundos não permite nenhuma decisão de negócio. Um relatório que diz ponto de saturação em mil e duzentas requisições por segundo, pico de produção em quatrocentas e cinquenta, margem de dois vírgula sete vezes, e vazão útil de setenta e quatro por cento a cento e cinquenta por cento da saturação, permite decidir sobre campanha, sobre capacidade e sobre prioridade de correção sem nenhuma tradução adicional.

06

A sequência que transforma o ensaio em evidência

Reescrever o ensaio inteiro de uma vez costuma travar antes do primeiro resultado. A sequência abaixo entrega valor em cada passo e pode ser interrompida em qualquer ponto sem perder o que já foi feito, o que importa porque cada passo mostra algo novo e justifica o seguinte.

  1. Instrumente a omissão antes de mudar qualquer coisa. Adicione o instante agendado às medições do ensaio atual e publique a razão entre os dois percentis. Se ela passar de dois, você já sabe que todos os relatórios anteriores subestimavam a latência, e isso sozinho costuma ser suficiente para autorizar o restante do trabalho.
  2. Troque o intervalo constante pelo exponencial. São três linhas e a taxa média não muda, então a comparação com ensaios anteriores permanece válida. Espere ver o percentil noventa e nove subir sem que nada tenha piorado: o que mudou é que agora ele está sendo medido.
  3. Corrija a cardinalidade dos dados antes de qualquer ajuste de infraestrutura. Extraia a distribuição real de identificadores de um dia de log de produção e alimente o gerador com ela. Sem esse passo, toda medição de banco e de cache do ensaio é ficção, e otimizar em cima dela desperdiça semanas.
  4. Encontre o ponto de saturação com um ensaio de degrau. Suba em patamares de cinco minutos até a vazão útil parar de crescer, e registre esse número junto com o pico real de produção dos últimos noventa dias. A razão entre os dois é a sua margem, e é o primeiro número do novo relatório.
  5. Rode um ensaio de rajada a quatro vezes a média durante trinta segundos. Meça o tempo de recuperação depois do fim da rajada. Esse é o teste que revela retry sem limite e fila sem teto, e ele leva cinco minutos para rodar.
  6. Só então rode a resistência de quatro horas a setenta por cento da capacidade, com dois por cento de falha injetada nas dependências. É o ensaio mais caro em tempo de relógio e o único que encontra vazamento, e ele deve rodar de madrugada uma vez por semana, não a cada pedido de mudança.

O terceiro passo é o que mais gera resistência e o que mais muda resultado. Gerar dados sintéticos com cem clientes é rápido e dá um ensaio que roda em qualquer laptop; extrair a distribuição real de um log de produção exige uma conversa sobre acesso a dado e um cuidado de anonimização. A diferença de resultado é grande demais para ignorar: com cem clientes a taxa de acerto do cache fica em noventa e nove por cento e o banco quase não é exercitado, e é justamente o banco que quebra em produção. Uma alternativa aceitável quando o acesso ao log é inviável é reproduzir apenas o formato da distribuição, mantendo a cauda longa de identificadores raros mesmo que os valores sejam gerados.

Sobre a frequência, a divisão que funciona na prática é colocar degrau e rajada no fluxo de entrega, porque juntos levam menos de trinta minutos e pegam regressão de capacidade a cada mudança, e deixar resistência e caos em agenda semanal noturna. Tentar rodar as quatro a cada mudança faz o time desligar o teste inteiro em duas semanas, e um ensaio desligado encontra ainda menos do que um ensaio que mente.

FAQ

Perguntas frequentes

Preciso trocar a ferramenta de teste de carga que já uso para corrigir a omissão coordenada?

Na maioria dos casos não, e vale verificar antes de propor uma migração que costuma custar semanas. Algumas ferramentas modernas já implementam a correção e expõem as duas medições com nomes diferentes, sendo uma delas o tempo desde o agendamento e outra o tempo desde o envio efetivo; nesses casos o trabalho é apenas descobrir qual métrica o seu relatório está publicando, e a resposta frequente é que o painel padrão mostra a errada porque ela é a mais bonita. Outras ferramentas suportam um modo de chegada com taxa fixa, às vezes chamado de taxa constante ou de executor de chegada, que é justamente o gerador de laço aberto; ativar esse modo costuma ser uma mudança de poucas linhas na configuração do cenário, e o principal cuidado é dimensionar o número de trabalhadores pré-alocados com folga, porque se o gerador ficar sem trabalhador disponível ele volta a coordenar com o serviço e o problema retorna com outro nome. Quando a ferramenta não oferece nenhuma das duas coisas, ainda existe uma correção aproximada que não exige troca: registrar o cronograma pretendido em paralelo e, na análise, reconstituir as medições ausentes atribuindo a cada requisição que deveria ter partido durante uma pausa a espera correspondente. É menos preciso do que medir de fato, mas é ordens de magnitude melhor do que publicar um percentil que omitiu justamente os piores casos. O critério para decidir migrar é o fator de omissão medido: abaixo de um vírgula três a ferramenta atual está acompanhando o cronograma e não há motivo para trocar nada.

Como testar carga contra dependências externas que eu não controlo e que têm limite de taxa?

A resposta depende de qual pergunta você está fazendo, e misturar as duas perguntas em um só ensaio é o erro mais comum nessa situação. Se a pergunta é sobre a capacidade do seu serviço, a dependência externa deve ser substituída por um duplo que responde com a distribuição de latência real dela, extraída dos seus próprios traços de produção, incluindo a cauda e não apenas a mediana; um duplo que responde sempre em dez milissegundos torna o ensaio inútil justamente porque remove a fonte de fila. Se a pergunta é sobre o comportamento do seu serviço quando a dependência degrada ou recusa, então o duplo precisa ser programável para reproduzir os modos de falha reais dela: devolver quatrocentos e vinte e nove com cabeçalho de espera, devolver quinhentos e três, parar de responder sem fechar a conexão, e devolver sucesso com latência de dez segundos, que é o modo mais cruel porque não dispara nenhum tratamento de erro. Testar contra o ambiente de homologação do provedor raramente responde a qualquer uma das duas perguntas, porque o dimensionamento e os limites de homologação não são os de produção, e você acaba medindo a infraestrutura de teste de outra empresa. Há um terceiro caso que merece cuidado: quando a dependência externa é o gargalo real, o ponto de saturação do seu serviço é definido por ela e não por você, e o ensaio precisa deixar isso explícito no relatório, porque a correção não é escalar a sua aplicação e sim negociar limite, adotar cache ou mudar o padrão de chamada.

Vale a pena testar carga em produção, e como fazer isso sem causar o incidente que se quer evitar?

Vale, e para várias das seis diferenças listadas no artigo é a única forma de obter uma resposta confiável, porque estado acumulado, concorrência com trabalhos em lote e comportamento real das dependências não são reproduzíveis em ambiente separado sem um custo que quase nenhuma empresa aceita pagar. O que torna a prática segura são quatro controles aplicados juntos, e a ausência de qualquer um deles é o que produz as histórias de terror que dão má fama à técnica. O primeiro é marcação de tráfego sintético que atravessa toda a cadeia de chamadas, para que nenhum dado de teste entre em faturamento, em relatório de negócio ou em treinamento de modelo, e para que o time de plantão distinga imediatamente carga sintética de carga real ao olhar um alerta. O segundo é um interruptor de desligamento acionável em segundos por qualquer pessoa de plantão, sem depender de entrega nova, porque a decisão de abortar precisa ser mais rápida do que a formação da fila. O terceiro é abortar automaticamente por indicador de serviço real e não por métrica do próprio ensaio, tipicamente interrompendo quando a latência do tráfego orgânico passa de um limiar ou quando o orçamento de erro do período começa a ser consumido. O quarto é começar com uma fração pequena e crescer devagar, algo como um por cento do tráfego em janela de baixa e dobrando a cada ensaio bem sucedido ao longo de semanas. Com esses quatro controles, o ensaio em produção responde perguntas que nenhum ambiente de homologação responde; sem eles, ele é apenas um incidente agendado.

O ensaio que nunca falha não está aprovando o sistema, está aprovando a si mesmo

Um teste de carga que sempre passa não é sinal de sistema robusto, é sinal de ensaio que não encontra nada. O laço fechado reduz a pressão quando o serviço degrada, a omissão coordenada apaga do relatório exatamente as medições ruins, o intervalo constante remove a formação de fila, os dados sintéticos escondem o banco e cinco minutos de duração são curtos demais para qualquer vazamento. Trocar o critério de limiar de latência por ponto de saturação e margem, e publicar o fator de omissão junto com cada percentil, transforma um relatório decorativo em evidência utilizável para decidir sobre campanha e capacidade. Posso revisar o seu ensaio atual, medir quanto ele está subestimando a latência hoje, reconstruir o gerador em laço aberto com dados de cardinalidade real e entregar o ponto de saturação e a margem do seu serviço.