Planejamento de capacidade
LidoEsta aula aborda o planejamento de capacidade em DevOps, explorando escalabilidade, load testing, previsão de demanda e trade-offs. Você aprenderá a dimensionar infraestrutura de forma eficiente, testar limites e equilibrar custo, desempenho e disponibilidade.
O planejamento de capacidade é uma disciplina essencial em DevOps que visa garantir que os sistemas tenham recursos suficientes para atender à demanda atual e futura, sem desperdício ou indisponibilidade. Em um cenário de nuvem e microsserviços, onde a elasticidade é possível, mas não infinita, saber dimensionar corretamente é uma habilidade crítica. Nesta aula, exploraremos os conceitos fundamentais, ferramentas e estratégias para planejar a capacidade de forma proativa, alinhada aos objetivos de negócio.
Vamos começar entendendo o que significa escalabilidade e como ela se relaciona com o planejamento de capacidade. Em seguida, veremos como o load testing ajuda a validar decisões, como prever demandas futuras com base em dados históricos e, por fim, discutiremos os trade-offs envolvidos, como custo versus desempenho.
Escalabilidade
Escalabilidade é a capacidade de um sistema de lidar com o aumento de carga de trabalho adicionando recursos, seja aumentando a capacidade de um único nó (escalabilidade vertical) ou adicionando mais nós (escalabilidade horizontal). No contexto de capacidade, precisamos decidir qual abordagem usar e quando. A escalabilidade vertical é simples, mas tem limites físicos e pode causar interrupções. A horizontal é mais flexível, mas exige arquiteturas distribuídas e balanceamento de carga.
No planejamento de capacidade, escalabilidade não é apenas uma propriedade técnica; é uma estratégia de negócio. Sistemas que não escalam podem perder clientes ou gerar custos excessivos. Por isso, é crucial definir métricas de escalabilidade, como throughput, latência e utilização de recursos, e monitorá-las continuamente.
Exemplo prático: suponha uma aplicação web que processa pedidos. Inicialmente, um único servidor é suficiente. Conforme a demanda cresce, você pode aumentar a CPU/memória (vertical) ou adicionar mais servidores atrás de um load balancer (horizontal). Em nuvem, o auto scaling pode automatizar esse processo com base em métricas como CPU ou requisições por segundo.
# Exemplo de configuração de auto scaling na AWS (trecho de CloudFormation)
Resources:
MyAutoScalingGroup:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
MinSize: '1'
MaxSize: '10'
DesiredCapacity: '2'
LaunchConfigurationName: !Ref MyLaunchConfig
VPCZoneIdentifier: [subnet-12345678]
Tags:
- Key: Name
Value: MyASGLoad testing (visão geral)
Load testing é o processo de submeter um sistema a cargas de trabalho simuladas para observar seu comportamento sob estresse. Ele ajuda a identificar gargalos, limites de capacidade e pontos de falha antes que eles ocorram em produção. No planejamento de capacidade, o load testing fornece dados empíricos sobre quantos usuários ou requisições o sistema pode suportar com determinada configuração.
Existem vários tipos de testes de carga: teste de estresse (além do limite), teste de pico (picos súbitos), teste de endurance (por longos períodos) e teste de volume (grandes quantidades de dados). Ferramentas comuns incluem Apache JMeter, k6, Locust e Gatling. Cada uma tem suas particularidades, mas todas geram relatórios de métricas como tempo de resposta, throughput e erro.
Um bom load testing deve ser planejado: definir objetivos, criar cenários realistas, executar em ambiente semelhante à produção e analisar resultados. Os resultados alimentam decisões de capacidade, como quantos pods/instâncias são necessários para atender a um SLA de latência.
# Exemplo de teste de carga com k6 (script.js)
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
stages: [
{ duration: '2m', target: 100 }, // ramp up to 100 users
{ duration: '5m', target: 100 }, // stay at 100 users
{ duration: '2m', target: 0 }, // ramp down to 0 users
],
};
export default function () {
const res = http.get('https://test-api.example.com');
check(res, { 'status 200': (r) => r.status === 200 });
sleep(1);
}Previsão
Prever a demanda futura é um dos desafios mais complexos do planejamento de capacidade. Baseia-se em dados históricos de uso, sazonalidade, tendências de crescimento e eventos planejados (lançamentos, campanhas). Existem métodos qualitativos (opinião de especialistas) e quantitativos (análise de séries temporais, regressão).
Ferramentas de monitoramento, como Prometheus e Grafana, fornecem séries temporais de métricas. Com elas, podemos aplicar modelos estatísticos ou até machine learning para prever a demanda. Porém, previsões nunca são perfeitas; é preciso considerar margens de erro e planos de contingência.
Um exemplo prático: uma loja online tem picos de tráfego em novembro (Black Friday). Com dados históricos, podemos prever um aumento de 300% e provisionar capacidade extra. Mas se a previsão for muito alta, há desperdício; se for baixa, há indisponibilidade. Por isso, é comum usar reservas de capacidade elástica, como auto scaling, combinadas com previsões.
# Exemplo de consulta PromQL para previsão simples (usando taxa de crescimento)
# Previsão de CPU para daqui a 7 dias (supondo crescimento linear)
predict_linear(node_cpu_seconds_total[1h], 7 * 24 * 3600)Trade-offs
Planejar capacidade envolve equilibrar vários trade-offs. O principal é custo versus desempenho: provisionar demais aumenta custos, provisionar de menos causa degradação. Outros trade-offs incluem disponibilidade versus complexidade, capacidade reservada versus elasticidade, e precisão da previsão versus esforço de modelagem.
Uma estratégia comum é usar capacidade base para a demanda média e escalar automaticamente para picos. Isso reduz custos sem sacrificar desempenho. Porém, o auto scaling não é instantâneo; pode levar minutos para iniciar novos recursos, então é preciso ter capacidade mínima para evitar quedas durante rampas rápidas.
Outro trade-off é a escolha entre instâncias sob demanda e reservadas (ou spot). Instâncias reservadas oferecem descontos, mas exigem compromisso; spot são baratas, mas podem ser interrompidas. Para cargas críticas, é melhor usar sob demanda ou reservadas; para processamento em lote, spot pode ser ideal.
# Exemplo: decisão de compra de instâncias reservadas vs sob demanda (AWS)
# Cálculo de custo anual: sob demanda vs reservada
# Sob demanda: $0.10/hora * 24 * 365 = $876
# Reservada (1 ano, pagamento adiantado): $600 (exemplo)
# Economia: $276, mas com compromisso de uso contínuoBoas Práticas
- Monitore continuamente: use métricas como CPU, memória, latência e taxa de erros para basear decisões.
- Automatize o dimensionamento: configure auto scaling sempre que possível.
- Documente premissas e planos: registre a capacidade atual, previsões e decisões.
- Revise regularmente: a capacidade deve ser reavaliada conforme o sistema evolui.
- Combine previsão com elasticidade: nunca confie apenas em previsões; tenha mecanismos de resposta a picos inesperados.
Referências
- AWS Well-Architected Framework
- Azure Architecture Patterns
- Google SRE Book
- k6 Documentation
- Apache JMeter
- Prometheus Query Basics
- Grafana Documentation
- DigitalOcean Community Tutorials
Exercícios
Explique a diferença entre escalabilidade vertical e horizontal e dê um exemplo de quando cada uma é mais adequada.
✓ Resposta: Escalabilidade vertical (scale-up) envolve aumentar os recursos de um único nó (CPU, RAM, disco). É simples, mas tem limites físicos e pode exigir downtime. Horizontal (scale-out) adiciona mais nós e distribui carga, exigindo balanceamento de carga e arquitetura distribuída. Exemplo: para um banco de dados monolítico, vertical pode ser mais fácil (aumentar memória); para aplicações stateless, horizontal é ideal (adicionar pods).Qual é o objetivo principal do load testing e como ele se relaciona com o planejamento de capacidade?
✓ Resposta: O load testing visa avaliar o comportamento do sistema sob carga, identificando limites e gargalos. Ele fornece dados reais sobre capacidade máxima, latência e erros, que são usados para dimensionar recursos adequadamente e validar SLAs.Cite três métodos quantitativos de previsão de demanda e explique brevemente cada um.
✓ Resposta: 1) Médias móveis: calcula a média de um período para suavizar flutuações; 2) Suavização exponencial: dá mais peso a dados recentes; 3) Regressão linear: modela relação entre variáveis (tempo e demanda) para extrapolar.Descreva dois trade-offs no planejamento de capacidade e como mitigá-los.
✓ Resposta: 1) Custo vs desempenho: provisionar demais aumenta custo, de menos degrada; mitigar usando auto scaling e monitoramento. 2) Precisão da previsão vs esforço: modelos complexos podem ser caros; mitigar usando previsões simples combinadas com elasticidade.Qual é a importância do auto scaling no planejamento de capacidade e quais são suas limitações?
✓ Resposta: O auto scaling permite ajustar automaticamente a capacidade com base em métricas, otimizando custo e desempenho. Limitações: não é instantâneo (pode levar minutos para provisionar), não lida bem com picos súbitos e pode causar flutuações se configurado incorretamente.