- Após a implantação de uma nova camada de cache, a latência média piorou de 112 ms para 122 ms, mas a mediana melhorou de 99 ms para 54 ms e o p99 piorou de 309 ms para 678 ms, tornando difícil julgar sucesso ou fracasso com uma única estatística
- Depois da implantação, a distribuição de latência se dividiu de um pico para dois; ao sobrepor a função de distribuição acumulada (CDF), vê-se que, em torno de 140 ms, as requisições rápidas melhoraram e as lentas pioraram
- A função de deslocamento, que mostra a variação por percentil, junto com gráficos de ridgeline diários e heatmaps, revela a magnitude das melhorias e regressões, além de como o grupo de requisições lentas cresceu enquanto a taxa de implantação subia de 0% para 100%
- Ao dividir os dados por resultado do cache e tamanho da resposta, foi possível confirmar a causa da distribuição bimodal: acertos de cache em respostas pequenas ficaram mais rápidos, enquanto misses de cache em respostas grandes ficaram mais lentos por causa de um hop adicional
- Se escolhermos apenas a média ou um percentil específico, é possível justificar conclusões opostas; por isso, é preciso analisar a distribuição inteira e os subgrupos para chegar a ações como aumentar o tamanho máximo de objeto no cache ou dividir respostas grandes
Melhorias de desempenho que não apareciam em produção
- Melhorias de desempenho relacionadas ao
lldapareceram em benchmarks, mas, nos dashboards reais de produção, era difícil encontrar uma mudança clara por causa do ruído nos dados - A velocidade de build pode variar muito conforme várias variáveis, como cache frio, builds incrementais, execução local ou remota, estado do sistema e workload
- Um caso de avaliação de desempenho de build com função de distribuição acumulada (CDF) mostrou a necessidade de examinar os próprios dados de várias maneiras, em vez de depender de uma única imagem ou estatística
- Todos os exemplos foram gerados a partir de um único dataset sintético com seed fixa, e o script completo, incluindo um shebang de
nix-shell, permite reproduzir exatamente cada figura em um ambiente Nix - IA foi usada para criar os dados e os gráficos da narrativa
Uma implantação de cache que parecia fracasso pela média
- Para reduzir a latência das requisições de um serviço web, uma nova camada de cache foi implantada ao longo de uma semana, mas a latência média aumentou 9%, de 112 ms para 122 ms
- Olhando apenas a média, é fácil interpretar a mudança como uma regressão que justificaria reverter a alteração e iniciar resposta a incidente e post-mortem
Quatro conclusões a partir dos mesmos dados
- As estatísticas antes e depois da implantação apontam em direções diferentes
- Média: 112 ms → 122 ms, 9% pior
- Mediana p50: 99 ms → 54 ms, 46% melhor
- p95: 224 ms → 454 ms, 103% pior
- p99: 309 ms → 678 ms, 119% pior
- A média indica uma regressão leve, mas a mediana mostra que requisições típicas ficaram quase duas vezes mais rápidas, enquanto o p99 revela um problema sério em que as piores requisições ficaram mais de duas vezes mais lentas
- Como média e mediana calculadas sobre os mesmos dados apontam em direções opostas, é fácil escolher apenas a estatística que sustenta seu julgamento
Duas populações de requisições reveladas pela forma da distribuição
- No gráfico de densidade, a distribuição antes da implantação tinha um único pico, mas depois da implantação se dividiu em dois picos
- Essa forma explica a contradição entre as estatísticas, mas gráficos de densidade também têm limitações
- A forma muda conforme o parâmetro de suavização escolhido
- Quando as áreas preenchidas de duas distribuições se sobrepõem, a leitura fica difícil
- A existência de dois grupos aparece, mas é difícil identificar diretamente a posição de percentis como a mediana
Comparando todos os percentis com CDF
- A função de distribuição acumulada (CDF) mostra, para cada latência
x, a proporção de requisições concluídas em até x milissegundos - Ao sobrepor as CDFs antes e depois da implantação em um único gráfico, é possível ver como cada percentil se deslocou em toda a população de requisições
- Depois da implantação, a curva se desloca para a esquerda abaixo de 140 ms, indicando que mais requisições ficaram mais rápidas do que antes; depois de 140 ms, porém, mais requisições ficaram mais lentas
- O ponto em torno de 140 ms em que as duas curvas se cruzam é a fronteira onde o efeito da mudança passa de melhoria para piora
- Quando duas CDFs se cruzam, a direção do efeito depende do percentil escolhido, então nenhum percentil isolado consegue resumir toda a mudança
Medindo a variação em cada percentil
- A CDF mostra se cada faixa ficou mais rápida ou mais lenta, mas não mostra diretamente a magnitude da mudança
- A função de deslocamento (shift function) calcula, para cada percentil
p, a diferença entre a latência depois da implantação e a latência antes da implantação- Abaixo de 0 estão as faixas que melhoraram
- Acima de 0 estão as faixas que ficaram mais lentas
- Com isso, é possível verificar não só a direção da mudança em cada ponto da distribuição, mas também sua magnitude
A regressão que cresceu durante a implantação
- A nova camada de cache foi expandida gradualmente de 0% para 100% do tráfego ao longo de uma semana; comparar apenas dois momentos, antes e depois da implantação, faz perder as mudanças intermediárias
- Em um gráfico ridgeline com as distribuições diárias empilhadas, o pico principal das requisições rápidas se desloca para a esquerda conforme a implantação avança, enquanto um segundo pico de requisições lentas aparece à direita
- Ao mesmo tempo em que a mediana cai, a quantidade e a latência das requisições lentas aumentam silenciosamente
- Como a latência segue aproximadamente uma distribuição lognormal, usa-se escala logarítmica no eixo x
- Em um eixo linear, o pico das requisições rápidas sobe muito e as requisições lentas se espalham de forma tênue, dificultando ler os dois picos juntos
- Em um heatmap que mostra colunas por dia e a quantidade de tráfego por latência usando cores, a nova população de requisições também aparece de forma sutil
- Se a semana inteira for combinada em um único valor agregado, desaparecem as sete distribuições diárias diferentes e a tendência de mudança
Decompondo a distribuição bimodal em acertos e misses de cache
- Na análise real do
lld, foi necessário dividir os dados pelo tamanho do binário, por exemplo se era maior que 50 MiB, para identificar a distribuição bimodal da latência - Na nova camada do caso sintético, as requisições se dividem entre acertos (hits), atendidos pelo cache, e misses, encaminhados ao backend passando por um hop adicional
- Ao separar a CDF das requisições pós-implantação por resultado do cache, cada grupo volta a ter um único pico
- Acertos de cache se deslocam para a esquerda em relação à baseline existente, ficando mais rápidos
- Misses de cache ficam muito mais à direita por causa do custo do hop adicional
Causa e ação encontradas no tamanho da resposta
- Miss de cache é apenas o mecanismo de funcionamento; para entender quais requisições causam misses e por quê, é preciso olhar também para o tamanho da resposta
- O cache mantém objetos pequenos e usados com frequência, mas objetos grandes são expulsos ou nem entram nele desde o início
- Em um jointplot, que diferencia por cor acertos e misses de cache na relação entre latência e tamanho da resposta e combina as distribuições de densidade de cada eixo, os dois grupos aparecem claramente
- O grupo de respostas pequenas e baixa latência corresponde a acertos de cache
- O grupo de respostas grandes e alta latência corresponde a misses de cache
- A distribuição bimodal da latência veio da bimodalidade da distribuição de tamanhos de resposta, e é possível responder aumentando o tamanho máximo de objeto no cache ou dividindo respostas grandes
Olhar para a distribuição inteira, além de um único gráfico
- Um único painel ou gráfico não é suficiente para capturar toda a situação e, dependendo do caso, pode levar a uma decisão equivocada
- É preciso examinar os mesmos dados de várias formas para entender conjuntamente a forma da distribuição, o efeito por percentil, a mudança ao longo do tempo, os subgrupos e suas causas
- Em especial, a CDF é útil para comparar várias populações de requisições e representar a distribuição inteira em um único gráfico
Ainda não há comentários.