🧠 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
availabledofree -habaixo de 200–300 MB de forma persistente - Serviços a parar sem razão aparente — verificar OOM Killer
vmstata mostrar valores deso(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— colunassi/soacima 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?
