Troubleshooting: Performance e MemĂłria
Estado atual do servidor
# Verificar estado completo
free -h && swapon --show && pm2 list | grep -v "^$"Configuração
- RAM: 31GB total
- Swap: 5GB (criado por nos)
- Backend: 6 workers Ă ~2GB = ~12GB
- Frontend: ~60MB
- Outros servicos: ~3GB
Sintoma 1: Swap alto (>3GB)
swapon --show
# NAME TYPE SIZE USED PRIO
# /swapfile file 5G 3.2G -2 â PROBLEMA se >3GBCausa: 6 workers backend usando ~12GB de RAM com pressĂŁo de memĂłria. Node.js começa a usar swap â GC pauses â timeouts do Baileys â erros.
Monitorar:
# Ver processo mais pesado
ps aux --sort=-%mem | head -10
# Ver memoria por worker PM2
pm2 list | grep zpro-backend | awk '{print "Worker", $1, ":", $NF}'Solução temporåria: Sem reiniciar nada, aguardar Claude Code ser fechado (~4GB liberados).
Solução permanente: Reduzir CLUSTER_INSTANCES de 6 para 4 em backend/.env (requer pm2 restart â fora do horĂĄrio comercial)
Sintoma 2: Backend worker reiniciando com frequĂȘncia
pm2 list | grep zpro-backend
# Verificar coluna "restarts" â se >200 em 24h = problemaCausa: Worker atingiu max_memory_restart: 7G configurado.
ecosystem.config.js atual:
max_memory_restart: '7G',
node_args: '--max-old-space-size=5120',
min_uptime: '30s',
max_restarts: 15,
restart_delay: 20000Verificar logs de OOM:
pm2 logs zpro-backend --lines 20 --nostream 2>&1 | grep -i "memory\|heap\|OOM\|killed"
dmesg | grep -i "oom\|killed" | tail -10Sintoma 3: Frontend lento / timeout
# Verificar status do frontend
pm2 list | grep zpro-frontend
# Verificar logs de erro
cat /home/deployzdg/.pm2/logs/zpro-frontend-novo-error.log | tail -20Causa comum: Build Next.js grande + servidor com pouca RAM.
Solução:
# Verificar tamanho do .next
du -sh /home/deployzdg/zpro.io/frontend/.next/
# Reload (mais leve que restart)
pm2 reload zpro-frontend-novoSintoma 4: PostgreSQL terminando conexÔes
pm2 logs zpro-backend --lines 50 --nostream 2>&1 | grep "terminating connection"Causa: PgBouncer ou PostgreSQL matando conexÔes ociosas após timeout. Com 6 workers fazendo muitas queries = muitas conexÔes simultùneas.
Verificar conexÔes ativas (precisa de acesso ao banco):
SELECT count(*), state FROM pg_stat_activity
WHERE datname = 'postgres' GROUP BY state;Sintoma resultante: Worker crasha â Baileys desconecta â loop de reconexĂŁo.
Sintoma 5: Baileys timeouts durante init
pm2 logs zpro-backend --lines 20 --nostream 2>&1 | grep "Timed Out\|executeInitQueries"Causa: Alta pressĂŁo de memĂłria â GC pauses â WebSocket WhatsApp timeout durante init.
Cadeia: swap alto â GC pause â timeout Baileys â worker restart â Baileys reconecta â loop.
Comandos de diagnĂłstico rĂĄpido
# Snapshot completo do sistema
echo "=== RAM ===" && free -h
echo "=== SWAP ===" && swapon --show
echo "=== DISCO ===" && df -h / | head -2
echo "=== PM2 ===" && pm2 list
echo "=== TOP PROCESSOS ===" && ps aux --sort=-%mem | head -8
echo "=== SWAP USAGE ===" && cat /proc/swaps
echo "=== BACKEND LOGS ===" && pm2 logs zpro-backend --lines 5 --nostream 2>&1 | tail -10AçÔes de emergĂȘncia (sem pm2 restart)
# 1. Liberar cache do sistema (nĂŁo afeta processos)
sudo sh -c "sync && echo 3 > /proc/sys/vm/drop_caches"
# 2. Verificar se swap pode ser reduzido
# (APENAS se RAM disponivel > swap usado)
free_ram=$(free -m | awk '/^Mem:/{print $7}')
swap_used=$(free -m | awk '/^Swap:/{print $3}')
echo "RAM disponivel: ${free_ram}MB | Swap em uso: ${swap_used}MB"
# 3. Reload gradual do backend (sem downtime)
pm2 reload zpro-backend
# 4. Frontend reload (sempre seguro)
pm2 reload zpro-frontend-novo