Performance engineering não é algo que você faz uma vez antes do lançamento. É uma disciplina contínua, integrada ao ciclo de desenvolvimento, monitorada constantemente, e melhorada iterativamente.
Performance é maratona, não sprint. Ganhos sustentáveis vêm de práticas consistentes, não de heróicas otimizações pontuais.
O Modelo Tradicional (e seus problemas)
Ciclo problemático
1. Desenvolver features (meses)
2. "Semana de performance" antes do release
3. Descobrir problemas graves
4. Correr para consertar
5. Lançar com dívida
6. Apagar incêndios em produção
7. Repetir
Por que falha
- Problemas descobertos tarde demais
- Arquitetura já solidificada
- Pressão de deadline
- Correções são patches, não soluções
- Time exausto de tanto incêndio
O Modelo Contínuo
Ciclo saudável
Cada commit:
→ Testes de performance automatizados
→ Comparação com baseline
→ Gate de qualidade
Cada deploy:
→ Canary com métricas
→ Comparação A/B
→ Rollback automático se degradar
Constantemente:
→ Monitoramento de SLOs
→ Alertas proativos
→ Profiling em produção
→ Revisão de tendências
Implementando Performance Contínuo
1. Performance no CI/CD
# .github/workflows/perf.yml
name: Performance Pipeline
on: [push, pull_request]
jobs:
unit-perf:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Benchmark Tests
run: |
pytest tests/benchmarks/ \
--benchmark-json=results.json
- name: Compare with Baseline
run: |
python scripts/compare.py \
--current results.json \
--baseline baseline.json \
--threshold 10
load-test:
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- name: Deploy to Staging
run: ./deploy-staging.sh
- name: Load Test
run: |
k6 run tests/load.js \
--out json=load-results.json
- name: Validate SLOs
run: |
python scripts/validate-slos.py \
--results load-results.json
2. Canary Deployments
# Argo Rollouts
apiVersion: argoproj.io/v1alpha1
kind: Rollout
spec:
strategy:
canary:
steps:
- setWeight: 5
- pause: {duration: 10m}
- analysis:
templates:
- templateName: latency-check
- setWeight: 20
- pause: {duration: 10m}
- analysis:
templates:
- templateName: error-rate-check
- setWeight: 50
- pause: {duration: 10m}
- setWeight: 100
---
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
name: latency-check
spec:
metrics:
- name: latency-p99
successCondition: result < 0.2
provider:
prometheus:
query: |
histogram_quantile(0.99,
sum(rate(http_request_duration_seconds_bucket{canary="true"}[5m]))
by (le)
)
3. SLO Monitoring
# SLO definitions
slos:
- name: API Availability
target: 99.9%
window: 30d
indicator:
good: sum(rate(http_requests_total{status=~"2.."}[5m]))
total: sum(rate(http_requests_total[5m]))
- name: API Latency
target: 95%
window: 30d
indicator:
good: |
sum(rate(http_request_duration_seconds_bucket{le="0.2"}[5m]))
total: sum(rate(http_requests_total[5m]))
# Alertas baseados em burn rate
alerts:
- name: SLO Burn Rate High
expr: |
(
slo_error_budget_remaining /
slo_error_budget_total
) < 0.5
severity: warning
- name: SLO Burn Rate Critical
expr: |
(
slo_error_budget_remaining /
slo_error_budget_total
) < 0.2
severity: critical
4. Continuous Profiling
# Profiling em produção com sampling
import pyroscope
pyroscope.configure(
application_name="my-app",
server_address="http://pyroscope:4040",
# 10% dos requests
sample_rate=0.1,
)
# Profile automático
with pyroscope.tag_wrapper({
"endpoint": request.path,
"user_type": user.type
}):
return handle_request(request)
Práticas do Dia a Dia
Code Review focado em Performance
## PR Review Checklist
### Queries
- [ ] EXPLAIN rodado para queries novas/modificadas
- [ ] Sem N+1 (verificar includes/prefetch)
- [ ] Índices apropriados
### Algoritmos
- [ ] Complexidade O() aceitável
- [ ] Sem loops com I/O
### Recursos
- [ ] Connections/handlers são liberados
- [ ] Buffers têm limite
- [ ] Timeouts configurados
### Testes
- [ ] Benchmark test incluído se crítico
- [ ] Load test atualizado se necessário
Performance Budget
# Orçamento por endpoint
endpoints:
/api/products:
latency_p99: 100ms
throughput_min: 1000rps
/api/checkout:
latency_p99: 200ms
throughput_min: 500rps
/api/search:
latency_p99: 150ms
throughput_min: 2000rps
# Validação automatizada
on_budget_exceed:
- block_merge: true
- notify: "#perf-alerts"
- require_approval: "perf-team"
Weekly Performance Review
## Performance Review - Semana 42
### Métricas vs SLOs
| SLO | Target | Actual | Status |
|-----|--------|--------|--------|
| Availability | 99.9% | 99.95% | ✅ |
| Latency p99 | 200ms | 185ms | ✅ |
| Error Rate | 0.1% | 0.08% | ✅ |
### Tendências
- Latência p99 aumentou 5% vs semana passada
- Throughput estável
- Memory usage trending up (investigar)
### Top Hotspots (via continuous profiling)
1. OrderService.calculateTax - 15% CPU
2. ProductRepository.search - 12% CPU
3. JSON serialization - 8% CPU
### Ações
- [ ] Investigar memory trend
- [ ] Otimizar calculateTax
- [ ] Review de índices para search
### Incidentes
- Nenhum incidente de performance
Ferramentas do Ecossistema
Pipeline
CI/CD:
- GitHub Actions / GitLab CI
- Argo CD / Flux
Load Testing:
- k6
- Gatling
- Locust
Canary:
- Argo Rollouts
- Flagger
- Spinnaker
Observabilidade
Metrics:
- Prometheus
- Datadog
- New Relic
Tracing:
- Jaeger
- Tempo
- Zipkin
Profiling:
- Pyroscope
- Datadog Continuous Profiler
- Parca
Dashboards:
- Grafana
- Datadog
Análise
SLO Management:
- Nobl9
- Datadog SLOs
- Google SLO Generator
Alerting:
- Prometheus Alertmanager
- PagerDuty
- Opsgenie
Métricas de Sucesso do Programa
Maturidade do Programa:
Level 1 - Ad-hoc:
- Sem testes de performance
- Problemas descobertos em produção
- Reativo
Level 2 - Básico:
- Testes manuais antes de releases
- Monitoramento básico
- Alertas existem
Level 3 - Integrado:
- Testes automatizados no CI
- SLOs definidos
- Canary deployments
Level 4 - Proativo:
- Continuous profiling
- Performance budgets
- Análise de tendências
Level 5 - Otimizado:
- Cultura de performance em todo time
- Processo self-service
- Melhoria contínua mensurável
KPIs do programa
Processo:
- % de PRs com perf test: > 90%
- Lead time de fix de perf: < 1 dia
- Regressions detectadas antes de prod: > 95%
Qualidade:
- SLO compliance: > 99%
- Incidentes de perf/mês: < 1
- Error budget utilizado: < 50%
Eficiência:
- Custo por request: tendência de queda
- Throughput por $: tendência de alta
- Tempo gasto em perf work: < 20%
Conclusão
Performance engineering contínuo transforma performance de:
Problema → Disciplina
Reativo → Proativo
Evento → Processo
Individual → Time inteiro
Para começar:
- Semana 1: Adicione métricas básicas
- Semana 2: Defina SLOs iniciais
- Mês 1: Integre testes no CI
- Mês 2: Implemente canary
- Mês 3: Continuous profiling
- Ongoing: Refine e melhore
O objetivo não é perfeição imediata, mas melhoria contínua mensurável.
Performance engineering contínuo é como higiene: não é evento especial, é prática diária.