← Guia Completo: Diagnóstico de Desempenho em VMs Linux

🧠 Componente: Memória RAM e Swap. Em Linux, o kernel usa o espaço “livre” para cache de ficheiros — isto é comportamento normal e saudável. O erro mais comum no diagnóstico é confundir free com available. Este artigo explica como interpretar corretamente os dados de memória e identificar pressão real de RAM.

Quando suspeitar de problema de memória?

  • Sistema fica progressivamente mais lento ao longo do tempo sem reinício
  • Disco com atividade constante mesmo sem operações visíveis — sinal de paging para swap
  • Campo available do free -h abaixo de 200–300 MB de forma persistente
  • Serviços a parar sem razão aparente — verificar OOM Killer
  • vmstat a mostrar valores de so (swap out) acima de zero

1. free — Leitura e Interpretação Correta

# Estado atual de RAM e swap
free -h

# Exemplo de output:
#               total        used        free      shared  buff/cache   available
# Mem:           7.7G        2.1G        312M        145M        5.3G        5.2G
# Swap:          2.0G          0B        2.0G

# Monitorização contínua a cada 2 segundos
watch -n 2 free -h

Campos do free — o que realmente importa

Campo Significado Usar para diagnóstico?
total RAM total atribuída à VM Referência
used Memória em uso por processos + kernel Secundário
free Memória completamente livre e não usada ❌ Enganoso — ignorar
buff/cache Cache de filesystem e buffers de I/O (libertável) Informativo
available Estimativa de RAM disponível para novos processos ✅ Este é o valor relevante
Swap used Swap em uso — qualquer valor > 0 merece atenção ✅ Monitorizar
🔴 Erro comum: Um sistema com free = 50 MB e available = 4.5 GB está completamente saudável — o Linux usa a RAM “livre” como cache. O problema real é quando available é baixo, não free.

2. Análise de Swap — O Indicador Mais Crítico

# Estado das partições/ficheiros de swap
swapon --show
cat /proc/swaps
# Monitorizar swap in e swap out em tempo real
# si = páginas lidas do swap (swap in)
# so = páginas escritas para swap (swap out)
vmstat 1 10 | awk 'NR==1{print} NR>2{print $7, $8, " <-- si so"}'
# Processos que estão a usar swap (requer root)
for pid in /proc/[0-9]*; do
    awk '/VmSwap/{if($2>0) print FILENAME": "$2" kB"}' $pid/status 2>/dev/null
done | sort -t: -k2 -rn | head -10
🔴 Alerta crítico: so (swap out) acima de zero de forma contínua no vmstat indica paginação ativa para disco — degradação severa. O acesso ao swap é 100–1000× mais lento que à RAM. Aumentar RAM ou identificar e otimizar o processo que consome mais memória.

3. /proc/meminfo — Detalhe Completo

# Ver toda a informação de memória do kernel
cat /proc/meminfo

# Filtrar campos críticos
grep -E 'MemAvailable|SwapFree|SwapTotal|Dirty|Slab|VmallocUsed' /proc/meminfo

Campos críticos do /proc/meminfo

Campo Significado e limiar
MemAvailable RAM disponível — o mesmo que free -h coluna available
SwapTotal / SwapFree Capacidade e espaço livre de swap
Dirty Dados em cache aguardando escrita em disco — valores muito altos (>1 GB) podem causar write stalls
Slab Memória do kernel para estruturas internas — crescimento anormal indica leak de kernel
VmallocUsed Memória virtual mapeada pelo kernel

4. Identificar Processos com Maior Consumo de RAM

# Top 15 processos por memória física (RSS)
ps aux --sort=-%mem | head -15
# Mapa de memória de um processo específico
pmap -x <PID> | sort -k3 -rn | head -20
# smem — relatório de memória proporcional (mais preciso)
# apt install smem  /  yum install smem
smem -s pss -r | head -15
💡 RSS vs PSS: O RSS (Resident Set Size) soma memória partilhada entre processos múltiplas vezes — pode parecer que a memória total usada é superior à RAM total. O PSS (Proportional Set Size) distribui a memória partilhada proporcionalmente e é o valor mais preciso.

5. sar — Histórico de Memória e Swap

# Histórico de memória hoje
sar -r 1 5

# Histórico de swap hoje (si/so histórico)
sar -W 1 5

# Histórico de memória de ontem
sar -r -f /var/log/sa/sa$(date -d yesterday +%d)

6. OOM Killer — Detetar Processos Eliminados

# Verificar se o OOM killer foi ativado
dmesg -T | grep -i 'oom\|killed process'

# Em sistemas com journald (systemd)
journalctl -k | grep -i 'oom\|killed'

# Em sistemas clássicos
grep -i 'oom\|killed' /var/log/syslog | tail -20      # Debian/Ubuntu
grep -i 'oom\|killed' /var/log/messages | tail -20    # RHEL/CentOS
🔴 OOM Killer ativado: O kernel eliminou processos por falta de memória. O output do dmesg indica qual processo foi eliminado e qual consumia mais RAM nesse momento. Esta é frequentemente a explicação para serviços que pararam inesperadamente.

7. Ajustar Swappiness

# Ver valor atual (default: 60)
sysctl vm.swappiness

# Em servidores, reduzir para minimizar uso de swap
sysctl -w vm.swappiness=10

# Tornar permanente
echo 'vm.swappiness=10' >> /etc/sysctl.conf
sysctl -p
💡 Swappiness: Um valor de 60 (default) indica que o kernel começa a usar swap quando a RAM livre cai para 40%. Para servidores com muita RAM e workloads intensivos, reduzir para 10 evita swap prematuro e melhora a responsividade.

8. Checklist — Diagnóstico de Memória

  • free -h — campo available abaixo de 200 MB?
  • vmstat 1 5 — colunas si/so acima de zero?
  • swapon --show — swap em uso? Quantos MB?
  • ps aux --sort=-%mem | head -10 — maiores consumidores de RAM?
  • grep Dirty /proc/meminfo — Dirty cache muito elevado?
  • dmesg -T | grep -i oom — OOM Killer foi ativado?
  • sar -W — histórico de swap in/out de hoje?

Este artigo foi útil?

Duarte Spínola

Deixe um Comentário