Pular para o conteúdo

Voltar para o blog

Performance

Por que seu p99 mente

· 9 min

O p99 é a métrica padrão pra latência de cauda, mas é rotineiramente calculado de formas que escondem exatamente os problemas que deveria capturar. Um dashboard verde não significa que a experiência do 1% mais lento dos usuários está boa, significa que a conta que gerou aquele número escondeu o que estava acontecendo com eles.

Ilustração de uma curva de distribuição com cauda longa

Percentil de percentis não é percentil

Um erro comum é agregar o p99 entre múltiplas instâncias, ou entre janelas de tempo, tirando a média (ou o próprio percentil) dos percentis já calculados de cada uma. Matematicamente isso descarta informação: uma instância consistentemente lenta pode ficar diluída na média das outras e nunca aparecer no número final, mesmo que um em cada cem usuários daquela instância específica esteja tendo uma experiência ruim o tempo todo.

Coordinated omission: o benchmark que mente sozinho

Um gerador de carga que espera a resposta antes de mandar a próxima requisição subamostra justamente as requisições lentas, enquanto o servidor está travado processando uma delas, menos requisições são enviadas naquele intervalo, então o período mais lento do sistema acaba sub-representado na amostra final. O resultado é um percentil medido em teste bem melhor do que o que a produção realmente vai entregar, onde requisições continuam chegando independente do que o servidor está fazendo.

Amostragem também distorce a cauda

Coletar métricas por amostragem (registrar só 1 a cada N requisições) funciona bem pra mediana, mas é estatisticamente instável pra p99 e p999 justamente porque esses são eventos raros, menos amostras na cauda significam intervalos de confiança bem mais largos, e uma linha de p99 suave no dashboard pode ser só um artefato de poucas amostras ali, não um sinal real de estabilidade.

O que realmente ajuda

Histogramas de verdade (como os do formato HDR) permitem calcular percentis exatos a partir da distribuição bruta, em vez de agregar percentis já calculados por instância, e ferramentas de teste de carga com modelo aberto (que não esperam resposta antes de disparar a próxima requisição) evitam o problema de coordinated omission desde a coleta. Nenhum dos dois é mais trabalho do que já se gasta hoje olhando um número que, na prática, está mentindo.