Duração: 80 minutos (explicação 20, prática guiada 50, verificação 10). Resultados dos TdR trabalhados: Conceber, configurar e administrar redes pequenas, médias e grandes; LAN, WAN, WLAN, virtualização e nuvem; Trabalho em equipa, projectos, ética e confidencialidade.
Objectivos
- Explicar planeamento de capacidade: medir a utilização, resumir com percentis, projectar a tendência e decidir a tempo, tendo em conta prazos de contratação.
- Recolher amostras de débito a partir dos contadores de uma interface e comparar média, percentil 95 e máximo.
- Projectar com regressão linear o mês em que a utilização atinge um limiar justificado, e explicar os limites da projecção.
- Relacionar a capacidade com novos serviços, crescimento de utilizadores e requisitos de continuidade.
Medir e resumir sem esconder picos
A média de um mês esconde os picos que os utilizadores sentem. O percentil 95 (p95) é o valor abaixo do qual ficam 95 % das amostras: ignora os 5 % mais altos, que podem ser picos breves, mas mostra a carga das horas de maior uso. Muitos operadores facturam pelo p95 de amostras de 5 minutos; a instituição deve saber como o seu contrato calcula. O resultado depende do intervalo das amostras: amostras longas alisam os picos.
Um limiar de planeamento, por exemplo p95 a 70 % da capacidade, deixa margem para picos, crescimento imprevisto e uma ligação alternativa com menos capacidade em caso de falha. O número justifica-se: acima de cerca de 80 % sustentado as filas e o atraso crescem (módulo 10), e a contratação de mais capacidade demora meses; por isso decide-se antes de chegar lá.
Projectar e decidir
Com pelo menos seis a doze meses de p95 mensal, uma regressão linear dá a tendência (Mbit/s por mês) e o mês em que se atinge o limiar. É uma extrapolação: não prevê um novo serviço, a mudança de horário, a entrada de mais funcionários ou uma aplicação que passa para a nuvem. Por isso junta-se à tendência o calendário de projectos conhecidos e repete-se a análise todos os trimestres.
A decisão conta para trás a partir do mês previsto: tempo de aprovação orçamental, concurso, instalação pelo operador e testes. Se tudo isso demorar oito meses e o limiar for atingido em dez, a decisão é agora. O relatório indica os dados usados, o método, o resultado e as incertezas.
Caso fictício
A WAN da DPE (fictícia) tem 20 Mbit/s contratados. O chefe tem de propor no orçamento se aumenta a capacidade. A equipa tem 12 meses de p95 mensal (fictícios) e mede, na rede de prática, como média e p95 diferem num dia com um pico curto. Aprovação e contratação demoram, em conjunto, cerca de 7 meses (valor fictício). Todos os valores são fictícios.
Prática guiada em rede isolada
Rede de prática fictícia, criada dentro de um computador de prática com o script base (módulo 1, lição 1). Nunca use estes passos na rede de produção nem contra endereços reais. As saídas mostradas são exemplos didácticos, não resultados de uma execução.
Topologia (descrição em texto)
- pc-adm (10.10.10.10) — ligado a r1 pela VLAN 10.
- srv (10.10.20.53) — ligado a r1 pela VLAN 20.
- r1 (encaminhador da sede) — ligado a pc-adm, srv, r2 e isp.
- r2 (encaminhador da delegação) — ligado a r1 e a pc-del (10.20.10.10).
- isp (operador simulado) — ligado a r1 e ao servidor externo 198.51.100.10 (endereço dentro de isp).
- Medição: contadores de saída da interface r1-r2 (sentido sede → delegação), lidos com ip -j -s link no espaço de nomes r1.
- Carga: iperf3 -R (o srv envia para o pc-del) em três fases: 2 Mbit/s durante 50 s, 8 Mbit/s durante 20 s, 2 Mbit/s durante 50 s.
- Limite: amostras de 5 s numa rede virtual durante 2 minutos servem para comparar resumos, não representam um dia real.
Passos
Pré-verificação (não altera nada): ferramentas presentes, rede DPE activa, delegação chega ao srv e a pasta de trabalho do módulo ainda não existe (se existir, pode ter dados de outra pessoa ou de outra lição: pare e confirme antes de continuar).
for d in python3 git snmpget snmpwalk snmpd rsyslogd logger iperf3 sha256sum; do command -v $d >/dev/null || echo "Em falta: $d"; done ip netns list | grep -cE '^(pc-adm|srv|r1|r2|pc-del|isp)( |$)' sudo ip netns exec pc-del ping -c 2 10.10.20.53 | tail -2 test -e /tmp/dpe-m11 && echo 'ATENÇÃO: /tmp/dpe-m11 já existe' || echo 'pasta livre'Saída de exemplo (didáctica):
(nenhuma linha «Em falta») 6 2 packets transmitted, 2 received, 0% packet loss pasta livreCrie a pasta e grave os dois scripts e a série mensal fictícia (textos completos abaixo).
mkdir -p /tmp/dpe-m11/l5 && cd /tmp/dpe-m11/l5 cat > recolher.py <<'EOF' #!/usr/bin/env python3 """recolher.py — amostras do débito de saída de r1-r2 (rede de prática DPE). Uso: sudo python3 recolher.py N_AMOSTRAS INTERVALO_S SAIDA.csv Só lê contadores.""" import csv, json, statistics, subprocess, sys, time def bytes_tx(): r = subprocess.run(["ip", "-n", "r1", "-j", "-s", "link", "show", "dev", "r1-r2"], capture_output=True, text=True, check=True, timeout=5) return json.loads(r.stdout)[0]["stats64"]["tx"]["bytes"] try: n, intervalo, saida = int(sys.argv[1]), float(sys.argv[2]), sys.argv[3] assert n >= 2 and intervalo > 0 except (IndexError, ValueError, AssertionError): sys.exit("Uso: sudo python3 recolher.py N_AMOSTRAS(>=2) INTERVALO_S SAIDA.csv") try: amostras, antes, t0 = [], bytes_tx(), time.monotonic() for i in range(n): time.sleep(intervalo) agora, t1 = bytes_tx(), time.monotonic() mbps = (agora - antes) * 8 / (t1 - t0) / 1e6 amostras.append(round(mbps, 2)) print(f"amostra {i + 1:>2}: {mbps:5.2f} Mbit/s", flush=True) antes, t0 = agora, t1 except (subprocess.CalledProcessError, subprocess.TimeoutExpired, KeyError, json.JSONDecodeError) as e: sys.exit(f"ERRO ao ler contadores de r1-r2: {e}") try: with open(saida, "w", newline="") as f: csv.writer(f).writerows([["amostra", "mbps"]] + [[i + 1, v] for i, v in enumerate(amostras)]) except OSError as e: sys.exit(f"ERRO ao escrever {saida}: {e}") p95 = statistics.quantiles(amostras, n=20, method="inclusive")[18] print(f"média {statistics.mean(amostras):.2f} | percentil 95 {p95:.2f} | máximo {max(amostras):.2f} Mbit/s") EOF cat > prever.py <<'EOF' #!/usr/bin/env python3 """prever.py — tendência linear do percentil 95 mensal e mês em que atinge o limiar. Uso: python3 prever.py MENSAL.csv CAPACIDADE_MBPS LIMIAR(0-1) Aviso: extrapolação linear; só indica quando rever, não garante o futuro.""" import csv, statistics, sys try: ficheiro, cap, limiar = sys.argv[1], float(sys.argv[2]), float(sys.argv[3]) assert cap > 0 and 0 < limiar <= 1 except (IndexError, ValueError, AssertionError): sys.exit("Uso: python3 prever.py MENSAL.csv CAPACIDADE_MBPS LIMIAR(0-1)") try: with open(ficheiro, newline="") as f: linhas = [(int(r["mes"]), float(r["p95_mbps"])) for r in csv.DictReader(f)] except (OSError, KeyError, ValueError) as e: sys.exit(f"ERRO a ler {ficheiro}: {e}") if len(linhas) < 6: sys.exit("São precisos pelo menos 6 meses de dados para uma tendência minimamente útil.") x, y = zip(*linhas) r = statistics.linear_regression(x, y) alvo = cap * limiar print(f"{len(linhas)} meses; tendência {r.slope:+.2f} Mbit/s por mês; último valor {y[-1]:.1f} Mbit/s") if r.slope <= 0: print("Sem crescimento na tendência: rever no próximo ciclo.") else: mes = (alvo - r.intercept) / r.slope print(f"Limiar {limiar:.0%} de {cap:g} Mbit/s = {alvo:.1f} Mbit/s; atingido por volta do mês {mes:.1f} " f"(cerca de {mes - x[-1]:.0f} meses depois do último dado)") EOF cat > mensal.csv <<'EOF' mes,p95_mbps 1,6.1 2,6.4 3,6.8 4,7.0 5,7.5 6,7.9 7,8.2 8,8.6 9,9.1 10,9.4 11,9.8 12,10.3 EOFConsola D: servidor iperf3 que aceita vários testes (esperar «Server listening»; pára-se com Ctrl+C no fim). Consola R: inicie a recolha de 24 amostras de 5 s. Logo a seguir, consola B: as três fases de carga.
D: sudo ip netns exec srv iperf3 -s -B 10.10.20.53 R: sudo python3 recolher.py 24 5 amostras.csv B: for f in '2M 50' '8M 20' '2M 50'; do set -- $f; sudo ip netns exec pc-del iperf3 -c 10.10.20.53 -R -b $1 -t $2 >/dev/null || echo 'ERRO no iperf3'; doneSaída de exemplo (didáctica):
amostra 1: 2.07 Mbit/s … amostra 11: 8.31 Mbit/s … amostra 24: 2.06 Mbit/s média 3.12 | percentil 95 8.31 | máximo 8.36 Mbit/s (a primeira e a última amostra podem apanhar o início ou o fim das fases; os valores variam)Teste do tratamento de erros: argumentos inválidos.
sudo python3 recolher.py 1 5 x.csv; echo "código=$?" python3 prever.py nao-existe.csv 20 0.7; echo "código=$?"Saída de exemplo (didáctica):
Uso: sudo python3 recolher.py N_AMOSTRAS(>=2) INTERVALO_S SAIDA.csv código=1 ERRO a ler nao-existe.csv: [Errno 2] No such file or directory: 'nao-existe.csv' código=1Projecção com a série mensal fictícia: capacidade 20 Mbit/s, limiar 70 %.
python3 prever.py mensal.csv 20 0.7Saída de exemplo (didáctica):
12 meses; tendência +0.38 Mbit/s por mês; último valor 10.3 Mbit/s Limiar 70% de 20 Mbit/s = 14.0 Mbit/s; atingido por volta do mês 22.0 (cerca de 10 meses depois do último dado)Escreva a recomendação para o orçamento: dados, método, resultado, prazo de decisão (10 meses − 7 de contratação), riscos (serviços novos, falha da ligação alternativa) e data da próxima revisão.
nano /tmp/dpe-m11/l5/recomendacao.txt
Critérios de sucesso
- A dupla mostra que a média (≈ 3,1 Mbit/s) esconde o pico que o p95 (≈ 8,3 Mbit/s) revela.
- Os scripts terminam com mensagem clara e código 1 perante argumentos ou ficheiros inválidos.
- A projecção indica o mês ≈ 22 e a dupla calcula que a decisão tem de ser tomada até cerca de 3 meses depois do último dado.
- A recomendação distingue dados, projecção e incertezas, e marca a próxima revisão.
Como desfazer (reversão)
- Ctrl+C na consola D (servidor iperf3) e na consola R se a recolha não tiver terminado. Não usar pkill/killall. Confirmar: sudo ip netns pids srv não lista iperf3.
- rm -r /tmp/dpe-m11/l5 (scripts, dados fictícios e amostras). Se for a última lição do módulo nesta VM: rm -r /tmp/dpe-m11.
Alternativa em papel: tarefas e respostas esperadas
- Amostras (Mbit/s) de 20 intervalos: dezasseis de 2, e quatro de 9. Calcule a média e diga qual valor representa melhor as horas de maior uso numa ligação de 10 Mbit/s.
- Média = (16 × 2 + 4 × 9) / 20 = 3,4 Mbit/s. O p95 (9 Mbit/s, pois os 4 valores altos são 20 % das amostras) mostra que nas horas de maior uso a ligação está a 90 %; a média de 34 % dá uma ideia errada.
- Com a tendência de +0,38 Mbit/s por mês e 10,3 Mbit/s no mês 12, estime o p95 aos meses 18 e 24 (use a recta: 5,61 + 0,38 × mês).
- Mês 18: 5,61 + 0,38 × 18 ≈ 12,5 Mbit/s. Mês 24: ≈ 14,8 Mbit/s, acima do limiar de 14 Mbit/s (70 % de 20).
- O limiar é atingido cerca de 10 meses após o último dado; aprovação e contratação levam 7 meses. Até quando se tem de decidir? Que riscos podem antecipar a data?
- Até cerca de 3 meses após o último dado. Riscos: novos serviços (videoconferência, sistemas na nuvem), mais funcionários na delegação, cópias de segurança maiores, ou necessidade de a ligação alternativa aguentar a carga numa falha.
- Um colega diz: «a regressão prova que em 22 meses chegamos a 14 Mbit/s». Corrija.
- A regressão só extrapola a tendência passada; não prova nada sobre o futuro. Indica quando rever e decidir; a análise repete-se todos os trimestres e junta os projectos conhecidos.
Verifique o que aprendeu
Questão 1
Porque se usa o percentil 95 em vez da média para planear capacidade?
- Porque é sempre mais baixo
- Porque mostra a carga das horas de maior uso sem ser dominado por poucos picos muito breves
- Porque o SNMP só dá percentis
- Porque dispensa amostras
Ver resposta comentada
Resposta: Porque mostra a carga das horas de maior uso sem ser dominado por poucos picos muito breves
A média dilui os períodos de maior uso nas horas vazias; o p95 mostra o nível que a ligação atinge com frequência, ignorando os 5 % mais extremos.
Questão 2
Qual é o principal limite de uma projecção por regressão linear?
- Só funciona com IPv6
- Assume que o futuro segue a tendência passada e não prevê serviços novos ou mudanças de uso
- Exige 100 anos de dados
- Não usa números
Ver resposta comentada
Resposta: Assume que o futuro segue a tendência passada e não prevê serviços novos ou mudanças de uso
A tendência é um ponto de partida. Junta-se o calendário de projectos e repete-se a análise com dados novos.
Em leitura fácil
- Planear capacidade é ver se a ligação vai chegar no futuro.
- A média esconde as horas de muito uso.
- O percentil 95 mostra melhor essas horas.
- Uma linha de tendência ajuda a ver quando a ligação vai encher.
- Comprar mais ligação demora meses: decida cedo.
- A previsão não é certa: reveja muitas vezes.
Fontes
- Python 3 — documentação oficial dos módulos json, csv, subprocess e statistics (https://docs.python.org/3/library/)
- Linux iproute2 — páginas de manual ip(8), ip-netns(8), bridge(8), tc(8) (https://man7.org/linux/man-pages/man8/ip.8.html)
- iperf3 — documentação (ESnet) (https://software.es.net/iperf/)
- IETF RFC 2863 — The Interfaces Group MIB (IF-MIB) (https://www.rfc-editor.org/rfc/rfc2863)
- NIST SP 800-34 Rev. 1 — Contingency Planning Guide (https://csrc.nist.gov/pubs/sp/800/34/r1/upd1/final)
