← Guia Completo: Diagnóstico de Desempenho em VMs Linux
🔬 Ferramentas Avançadas. Este artigo reúne as ferramentas de diagnóstico mais avançadas para Linux — atop e o conjunto sysstat para monitorização all-in-one com histórico, ferramentas eBPF para observabilidade com baixo overhead (sobrecarga), um script de diagnóstico automático pronto a usar, e tabelas completas de referência rápida para uso no campo.
1. Visão All-in-One — atop e sar
# atop — monitor all-in-one por intervalos (CPU, disco, rede, memória por processo)
apt install -y atop # Debian / Ubuntu
yum install -y atop # RHEL / CentOS / Rocky (EPEL)
# Modo interactivo, 5 segundos por amostra
atop 5
# Ficheiros históricos (recolhidos pelo daemon atop em /var/log/atop/)
atop -r /var/log/atop/atop_$(date +%Y%m%d)
# sar (sysstat) — histórico dos contadores de sistema
sar -u 2 5 # CPU
sar -d 2 5 # Disco
sar -n DEV 2 5 # Rede
⚠️ O dstat foi descontinuado: o repositório oficial está arquivado desde 2020 e o pacote foi removido de Debian (bookworm em diante) e do EPEL 9 — apt install dstat falha nas versões actuais. Se ainda existe instalado numa VM antiga, funciona — mas para instalações novas usar atop ou sar, que mostram CPU, disco, rede e memória em simultâneo e mantêm histórico.
2. eBPF — Observabilidade Avançada com Baixo Overhead (sobrecarga)
# Instalar (Ubuntu/Debian — kernel >= 4.1)
apt install bpfcc-tools linux-headers-$(uname -r)
# RHEL/Rocky
yum install bcc-tools kernel-devel
Ferramentas eBPF mais úteis para diagnóstico
# Latência de I/O de disco por processo (histograma)
biolatency-bpfcc
# Top de syscalls por processo
syscount-bpfcc -p <PID>
# Novas conexões TCP em tempo real (quem está a ligar a quê)
tcpconnect-bpfcc
# Cache hit rate do page cache do filesystem
cachestat-bpfcc 1
# Latência de chamadas de sistema em histograma
funclatency-bpfcc '__x64_sys_read'
# I/O de disco com nome do processo
biosnoop-bpfcc | head -30
⚠️ Requisitos eBPF: Requer kernel Linux >= 4.1 e permissões de root. Em VMs com kernel muito antigo, verificar com uname -r. As ferramentas bpfcc têm overhead muito baixo comparado com strace e são seguras para usar em produção.
💡 biolatency-bpfcc: Gera um histograma de latência de I/O de disco em tempo real. Permite distinguir entre latência consistente (problema de hardware/storage) e latência com outliers ocasionais (problema de congestion ou caching).
3. Script de Diagnóstico Automático
Guardar como diagnostico_linux.sh, tornar executável com chmod +x diagnostico_linux.sh e executar com sudo ./diagnostico_linux.sh:
#!/bin/bash
# === SCRIPT DE DIAGNÓSTICO RÁPIDO — kbase.pt ===
# Executar com: sudo bash diagnostico_linux.sh
REPORT="/tmp/diagnostico_$(hostname)_$(date +%Y%m%d_%H%M).txt"
SEP="=========================================="
echo "$SEP" > $REPORT
echo "DIAGNÓSTICO LINUX — $(hostname)" >> $REPORT
echo "$(date)" >> $REPORT
echo "$SEP" >> $REPORT
echo -e "\n--- SISTEMA ---" >> $REPORT
uname -a >> $REPORT
cat /etc/os-release | grep PRETTY_NAME >> $REPORT
echo -e "\n--- UPTIME E LOAD AVERAGE ---" >> $REPORT
uptime >> $REPORT
echo "CPUs: $(nproc)" >> $REPORT
echo -e "\n--- CPU (3 amostras) ---" >> $REPORT
mpstat 1 3 >> $REPORT 2>/dev/null || \
top -bn3 | grep '%Cpu' >> $REPORT
echo -e "\n--- MEMÓRIA ---" >> $REPORT
free -h >> $REPORT
echo "" >> $REPORT
grep -E 'MemAvailable|SwapFree|Dirty' /proc/meminfo >> $REPORT
echo -e "\n--- TOP PROCESSOS CPU ---" >> $REPORT
ps aux --sort=-%cpu | head -10 >> $REPORT
echo -e "\n--- TOP PROCESSOS MEMÓRIA ---" >> $REPORT
ps aux --sort=-%mem | head -10 >> $REPORT
echo -e "\n--- DISCO (espaço) ---" >> $REPORT
df -h >> $REPORT
echo "" >> $REPORT
df -i >> $REPORT
echo -e "\n--- DISCO (I/O, 3 amostras) ---" >> $REPORT
iostat -xz 1 3 >> $REPORT 2>/dev/null
echo -e "\n--- REDE (interfaces) ---" >> $REPORT
ip -s link show >> $REPORT
echo -e "\n--- REDE (conexões TCP) ---" >> $REPORT
ss -s >> $REPORT
echo -e "\n--- ERROS KERNEL (últimas 30 linhas) ---" >> $REPORT
dmesg -T --level=err,warn 2>/dev/null | tail -30 >> $REPORT
echo -e "\n--- SERVIÇOS COM FALHA ---" >> $REPORT
systemctl --failed >> $REPORT 2>/dev/null
echo -e "\n--- ERROS SISTEMA (última hora) ---" >> $REPORT
journalctl -p err --since '1 hour ago' --no-pager 2>/dev/null | tail -20 >> $REPORT
echo ""
echo "✅ Relatório guardado em: $REPORT"
ls -lh $REPORT
4. Tabela Completa de Ferramentas Linux
5. Limiares de Referência Rápida
| Métrica |
✅ Normal |
⚠️ Atenção |
🔴 Crítico |
| Load Average (1 min) |
< nº CPUs |
= nº CPUs |
> 2× nº CPUs |
| CPU iowait (%wa) |
< 5% |
5 – 20% |
> 20% sustentado |
| CPU steal (%st) |
< 1% |
1 – 5% |
> 5% |
| RAM available (VM 4GB) |
> 500 MB |
200 – 500 MB |
< 200 MB |
| Swap out (vmstat so) |
0 |
ocasional |
contínuo > 0 |
| Disco await (ms) |
< 10 ms |
10 – 25 ms |
> 25 ms |
| Disco aqu-sz |
< 1 |
1 – 3 |
> 3 |
| Disco %util |
< 70% |
70 – 90% |
> 90% |
| Espaço livre disco |
> 20% |
10 – 20% |
< 10% |
| Inodes livres |
> 20% |
5 – 20% |
< 5% |
| TCP retransmissões/s |
0 |
< 5 |
> 5 |
6. Comandos por Sintoma — Referência Rápida
| Sintoma |
Primeiro Comando |
| Sistema lento — geral |
uptime && top -bn1 | head -20 |
| CPU a 100% |
mpstat -P ALL 1 3 && ps aux --sort=-%cpu | head -10 |
| iowait elevado |
iostat -xz 2 5 && iotop -o -bn 3 |
| RAM esgotada |
free -h && vmstat 1 5 | awk '{print $7,$8}' |
| Swap em uso ativo |
vmstat 1 10 (colunas si/so) && sar -W 1 5 |
| Disco lento |
iostat -xz 2 10 — focar em await e aqu-sz |
| Disco cheio |
df -h && df -i && du -sh /var/* | sort -rh |
| Ficheiro apagado ocupa espaço |
lsof | grep deleted | sort -k7 -rn | head -10 |
| Rede lenta |
mtr -n 8.8.8.8 && netstat -st | grep retransmit |
| Conectividade intermitente |
ping -c 100 <gateway> && ip -s link show |
| DNS lento |
time dig <domínio> && cat /etc/resolv.conf |
| Serviço parado |
systemctl --failed && journalctl -u <serviço> -n 50 |
| OOM Killer ativo |
dmesg -T | grep -i 'oom\|killed process' |
| Processo bloqueado (estado D) |
ps aux | awk '$8~/^D/' && iostat -xz 2 3 |
7. Checklist Final — 8 Fases
- ✅ Recolha inicial:
uptime && nproc && free -h && df -h — baseline em 30 segundos
- ✅ CPU: load average,
mpstat por core, CPU steal (%st), iowait (%wa)
- ✅ Memória: campo available no
free, swap in/out no vmstat, OOM no dmesg
- ✅ Disco:
iostat -xz — await e aqu-sz; iotop — processo responsável
- ✅ Rede: erros em
ip -s link; mtr para latência; retransmissões TCP
- ✅ Processos: processos em estado D;
systemctl --failed; strace -c se suspeito
- ✅ Kernel/Logs:
dmesg --level=err,warn; journalctl -p err; atop histórico
- ✅ Documentação: executar
diagnostico_linux.sh e guardar relatório com timestamp