Monitorar CPU, RAM e disco na VPS

Monitorar a VPS proativamente evita surpresas: disco cheio derruba todos os containers, CPU em 100% por horas indica processo malicioso ou loop infinito, RAM no limite causa OOM killer matando processos aleatórios. Com as ferramentas certas, você recebe alerta antes que o problema afete os usuários.

Monitoramento em tempo real: htop

htop é o monitor interativo padrão para Linux, mostra CPU, RAM, processos e permite matar processos diretamente:

bash
# Instalar htop
sudo apt install -y htop

# Executar
htop

# Atalhos úteis no htop:
# F6 / > — ordenar por coluna (CPU%, MEM%, etc.)
# F9      — matar processo (escolha SIGTERM ou SIGKILL)
# F5      — modo árvore (mostra hierarquia de processos)
# Space   — marcar processo para ação em lote
# u       — filtrar por usuário

# Ver uso de CPU e memória sem interface interativa
top -bn1 | grep -E "Cpu|Mem|Swap"

# Processos que mais consomem CPU agora
ps aux --sort=-%cpu | head -10

# Processos que mais consomem memória
ps aux --sort=-%mem | head -10

Uso de disco: df e du

Disco cheio é a causa silenciosa mais comum de falhas em VPS. Monitore regularmente:

bash
# Espaço livre por partição (formato humano)
df -h

# Espaço livre apenas da partição raiz
df -h /

# Encontrar os diretórios mais pesados
du -sh /* 2>/dev/null | sort -rh | head -10
du -sh /var/* 2>/dev/null | sort -rh | head -10

# Encontrar arquivos grandes (> 100 MB)
find / -xdev -size +100M -printf '%s %p
' 2>/dev/null \
  | sort -rn | numfmt --to=iec --field=1 | head -20

# Uso de disco por container Docker
docker system df
docker system df -v   # detalhado

Alertas automáticos com scripts

Configure alertas por e-mail ou webhook quando CPU, RAM ou disco atingirem limites:

bash
# Script de monitoramento — /opt/check-resources.sh
cat > /opt/check-resources.sh << 'SCRIPT'
#!/bin/bash
WEBHOOK_URL="https://hooks.slack.com/services/..."  # ou URL do n8n
HOSTNAME=$(hostname)
THRESHOLD_DISK=85
THRESHOLD_CPU=90
THRESHOLD_MEM=90

# Verificar disco
DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | tr -d '%')
if [ "$DISK_USAGE" -gt "$THRESHOLD_DISK" ]; then
  curl -s -X POST "$WEBHOOK_URL" \
    -H "Content-Type: application/json" \
    -d "{"text": "⚠️ DISCO em $HOSTNAME: ${DISK_USAGE}% usado"}"
fi

# Verificar RAM
MEM_USAGE=$(free | awk '/^Mem:/ {printf "%.0f", $3/$2*100}')
if [ "$MEM_USAGE" -gt "$THRESHOLD_MEM" ]; then
  curl -s -X POST "$WEBHOOK_URL" \
    -H "Content-Type: application/json" \
    -d "{"text": "⚠️ RAM em $HOSTNAME: ${MEM_USAGE}% usada"}"
fi
SCRIPT

chmod +x /opt/check-resources.sh

# Executar a cada 5 minutos via cron
echo "*/5 * * * * /opt/check-resources.sh" | crontab -

Netdata: painel visual de monitoramento

Netdata é um painel web completo com gráficos em tempo real, sem configuração manual de métricas:

bash
# Instalar Netdata via script oficial
curl https://get.netdata.cloud/kickstart.sh > /tmp/netdata-kickstart.sh
sh /tmp/netdata-kickstart.sh --stable-channel

# Acessar o painel em: http://IP_DA_VPS:19999

# Para proteger com Nginx (sem expor a porta 19999):
# No nginx.conf:
# location /netdata/ {
#     proxy_pass http://127.0.0.1:19999/;
#     auth_basic "Restrito";
#     auth_basic_user_file /etc/nginx/.htpasswd;
# }

# Criar senha para autenticação básica
sudo apt install apache2-utils -y
sudo htpasswd -c /etc/nginx/.htpasswd admin

Monitorar containers Docker

Além do sistema, monitore o consumo de recursos por container:

bash
# Snapshot de uso de todos os containers
docker stats --no-stream

# Monitoramento contínuo (atualiza a cada segundo)
docker stats

# Uso de memória detalhado por container
docker stats --format "table {{.Name}}	{{.MemUsage}}	{{.MemPerc}}	{{.CPUPerc}}"

# Eventos Docker (start, stop, die, OOM)
docker events --filter type=container

# Ver se algum container foi morto por OOM
docker inspect nome_do_container | grep -A5 "OOMKilled"
# OOMKilled: true = container foi morto por falta de memória

Não quer configurar manualmente?

Implante o VPS em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

Apertado. n8n (sem PostgreSQL externo) usa ~512 MB em idle. Com PostgreSQL no mesmo servidor: ~700 MB. Somando o OS (~200 MB), sobra pouco. Uma VPS de 2 GB é o mínimo confortável para n8n + banco. Para 2 GB, evite rodar Chatwoot ou outros apps pesados no mesmo servidor.

htop ordenado por CPU% (tecla F6) mostra imediatamente. Via terminal: ps aux --sort=-%cpu | head -5. Para processos que consomem por surtos curtos: pidstat -u 1 10 mostra média de CPU por segundo por 10 iterações.

Netdata Cloud (gratuito para até 5 nós) centraliza métricas de múltiplas VPS em um único painel. Alternativa self-hosted: Grafana + Prometheus (mais trabalho, mais controle). Para times: Victoria Metrics + Grafana é a stack mais leve e escalável.

Instale mailutils (apt install mailutils) e configure SMTP no /etc/ssmtp/ssmtp.conf. No script de monitoramento, substitua o curl do webhook por: echo "Disco em $HOSTNAME: ${DISK_USAGE}%" | mail -s "ALERTA DISCO" seu@email.com. O Netdata também tem notificações por e-mail configuráveis.

Load average (mostrado no htop no topo) é a média de processos aguardando CPU nos últimos 1, 5 e 15 minutos. Em VPS com 2 vCPUs, load average abaixo de 2.0 é normal. Acima de 4.0 por mais de 5 minutos indica saturação. Valores muito altos com CPU% baixo indicam I/O wait, processos esperando disco.