← 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

Ferramenta Instalação Uso principal
top / htop htop: apt/yum install htop Monitor interativo de CPU, memória e processos
vmstat pré-instalado CPU, memória, swap e I/O — visão sistémica
mpstat sysstat Estatísticas de CPU por core
iostat sysstat I/O de disco por dispositivo — await, %util, aqu-sz
sar sysstat Histórico de CPU, memória, disco e rede
pidstat sysstat CPU e I/O por processo com histórico
iotop apt/yum install iotop I/O em tempo real por processo
iftop apt/yum install iftop Tráfego de rede por endereço IP
nethogs apt/yum install nethogs Tráfego de rede por processo
atop apt/yum install atop Monitor completo com histórico persistente
dstat (descontinuado) repo oficial arquivado — removido de Debian e EPEL Substituir por atop ou sar
perf linux-tools-$(uname -r) Profiling de CPU e funções de kernel
strace pré-instalado Rastreio de syscalls de um processo
lsof pré-instalado Ficheiros e conexões abertas por processo
fio apt/yum install fio Benchmark de performance de disco
mtr apt/yum install mtr Diagnóstico de rede ping+traceroute em tempo real
tcpdump pré-instalado Captura de pacotes de rede
smartctl smartmontools Saúde de disco SMART
bpfcc-tools apt install bpfcc-tools Observabilidade avançada com eBPF (kernel >= 4.1)

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

  1. ✅ Recolha inicial: uptime && nproc && free -h && df -h — baseline em 30 segundos
  2. ✅ CPU: load average, mpstat por core, CPU steal (%st), iowait (%wa)
  3. ✅ Memória: campo available no free, swap in/out no vmstat, OOM no dmesg
  4. ✅ Disco: iostat -xz — await e aqu-sz; iotop — processo responsável
  5. ✅ Rede: erros em ip -s link; mtr para latência; retransmissões TCP
  6. ✅ Processos: processos em estado D; systemctl --failed; strace -c se suspeito
  7. ✅ Kernel/Logs: dmesg --level=err,warn; journalctl -p err; atop histórico
  8. ✅ Documentação: executar diagnostico_linux.sh e guardar relatório com timestamp