Análise das Principais Métricas
Desempenho de Processamento de Requisições
- Requisições por Segundo (RPS): Número total de requisições HTTP processadas em um intervalo de tempo. Reflete diretamente a vazão do servidor.
- Tempo Médio de Resposta: Tempo médio desde a recepção até a conclusão da resposta. Idealmente abaixo de 100 ms.
- Tempo de Resposta P95/P99: Tempo de resposta para 95% / 99% das requisições. Melhor indicador de comportamento em cenários extremos do que a média.
Métricas de Utilização de Recursos
- Uso de CPU: Percentual de recursos da CPU consumidos pelos processos do Uvicorn. Recomenda-se manter abaixo de 70% para garantir margem de segurança.
- Consumo de Memória: Volume de memória utilizado pelo processo. É necessário monitorar aumentos contínuos que indicam vazamento.
- Descritores de Arquivo: Refletem o número de conexões simultâneas. Ultrapassar o limite do sistema causa falhas de conexão.
Métricas de Conexão e Erros
- Conexões Ativas: Quantidade atual de conexões TCP mantidas. Controlado pelo parâmetro
--limit-concurrency. - Taxa de Erro: Pecrentual de respostas com status 4xx/5xx em relação ao total. Sistemas saudáveis devem manter abaixo de 0,1%.
- Timeout de Conexão: Número de requisições que excederam o tempo limite devido à sobrecarga. Deve ser analisado em conjunto com a performance do backend.
Guia de Definição de Limiares
Limiares de Configuração Básica
| Métrica | Limiar Sugerido | Parâmetro Associado |
|---|---|---|
| Máximo de conexões simultâneas | 1000–5000 | --limit-concurrency |
| Número de workers | núcleos de CPU × 2 + 1 | --workers |
| Máximo de requisições por worker | 1000–5000 | --max-requests |
Limiares de Alerta
- Uso de CPU: Acima de 80% por mais de 5 minutos → alerta.
- Crescimento de Memória: Aumento superior a 20% em 10 minutos → investigar vazamento.
- Taxa de Erro: Acima de 1% em 5 minutos → alarme automático.
- Latência de Resposta: P95 > 500 ms → pré-alerta.
Práticas de Otimização de Performance
Otimização do Event Loop
O Uvicorn oferece diferentes implementações de event loop. A escolha correta pode melhorar significativamente a performance:
- uvloop: Implementação baseada em libuv, 2 a 4 vezes mais rápida que o asyncio padrão.
- winloop: Alternativa para Windows, com desempenho superior ao loop padrão.
- rloop: Loop experimental escrito em Rust, adequado para tarefas com uso intenso de CPU.
Exemplo de configuração (comando reorganizado e opções alteradas):
uvicorn api:app --loop uvloop --http h11 --port 8000
Otimização da Arquitetura de Implantação
- Modo multiprocesso: Use
--workerspara aproveitar múltiplos núcleos. - Proxy reverso: Nginx para balanceamento de carga e cache de recursos estáticos.
- Integração com Gunicorn: Utilize o Gunicorn como gerenciador de processos, mantendo a performance do Uvicorn.
Integração com Ferramentas de Monitoramento
Monitoramento via Logs
Ative o log de acesso e ajuste o nível:
uvicorn api:app --access-log --log-level warning
Monitoramento com Ferramentas de Terceiros
- Prometheus: Utilize
prometheus-fastapi-instrumentatorpara expor métricas. - Datadog: Integre com
dd-tracepara rastreamento distribuído. - New Relic: O agente Python detecta automaticamente aplicações Uvicorn.
Solução de Problemas Comuns de Performance
Gargalos de Conexão
Quando ocorrem timeouts ou recusas de conexão, verifique:
- Limite de descritores de arquivo do sistema:
ulimit -n - Configuração de concorrência do Uvicorn:
--limit-concurrency - Velocidade de resposta do backend: Ajuste
--timeout-keep-alive
Detecção de Vazamentos de Recursos
Ferramentas para rastrear uso de recursos:
- memory_profiler: Análise de tendência de consumo de memória.
- tracemalloc: Rastreamento de alocações de memória em Python.
- py-spy: Amostragem de uso de CPU para identificar pontos quentes.
Métodos de Teste de Performance
Use ferramenats como wrk ou locust para testes de carga:
wrk -t2 -c50 -d20s http://localhost:8000/endpoint
As métricas a serem observadas incluem:
- RPS de pico
- Distribuição dos tempos de resposta
- Evolução da taxa de erro
- Curvas de uso de recursos
Documentação adicional disponível em docs/settings.md e docs/concepts/event-loop.md.