Skip to content
GitHub

Runbook: Horizontal Scaling

Propósito: Aumentar la capacidad de procesamiento del sistema para manejar mayor carga de usuarios o jobs.

Estrategia: Escalado horizontal (más instancias) y vertical (más recursos) gestionado por PM2.

Criticidad: 🟡 MEDIA - Afecta performance, no funcionalidad base


TipoMétodoUso
VerticalAumentar RAM/CPU de VMCuando un solo proceso necesita más recursos (ej: ETL pesado)
HorizontalAumentar réplicas (Cluster Mode)Cuando hay muchos requests concurrentes (API traffic)
DatabaseRead Replicas / PGBouncerCuando la DB es el cuello de botella

Node.js es single-threaded. Para utilizar todos los cores del CPU, usamos PM2 Cluster Mode.

  1. Verificar estado actual

    Terminal window
    pm2 list

    Verificar columnas mode (debe ser cluster) y instances.

  2. Escalar servicio (Zero Downtime)

    Para aumentar instancias de orchestrator a 4:

    Terminal window
    pm2 scale orchestrator 4

    Para usar todos los CPU disponibles automágicamente:

    Terminal window
    pm2 scale orchestrator max
  3. Verificar distribución de carga

    Terminal window
    pm2 monit

    Observar que los requests se distribuyan entre las instancias.

  4. Persistir cambios

    Terminal window
    pm2 save

Si el servidor se queda corto de RAM/CPU.

  1. Preparar Downtime

    Este proceso requiere reiniciar la VM. Notificar usuarios.

  2. Upgrade de Servidor (Provider)

    • Detener instancia VM
    • Cambiar tipo de instancia (ej: AWS t3.medium -> t3.large)
    • Iniciar instancia
  3. Ajustar memoria de Node.js

    Si aumentaste RAM, permite que Node use más heap:

    Terminal window
    # En ecosystem.config.js o comando de start
    node_args: "--max-old-space-size=4096" # 4GB
  4. Ajustar PostgreSQL

    Actualizar postgresql.conf para aprovechar nueva RAM:

    • shared_buffers: 25% de RAM total
    • effective_cache_size: 75% de RAM total
    • work_mem: (RAM total - shared_buffers) / (max_connections * 3)
    Terminal window
    sudo nano /etc/postgresql/16/main/postgresql.conf
    sudo systemctl restart postgresql

El cuello de botella suele ser las conexiones a DB.

  1. Diagnóstico

    Terminal window
    # Ver conexiones activas vs máximas
    sudo -u postgres psql -c "show max_connections;"
    sudo -u postgres psql -c "select count(*) from pg_stat_activity;"
  2. Ajustar Pool en Orchestrator

    Editar .env.production:

    Terminal window
    DB_MAX_CONNECTIONS=20 # Por instancia de PM2

    Nota: Si tienes 4 instancias PM2, total conexiones = 4 * 20 = 80.

  3. Implementar PgBouncer (Avanzado)

    Si max_connections de Postgres se satura (ej: > 500), usar PgBouncer como proxy.

    Terminal window
    sudo apt install pgbouncer
    # Configurar pgbouncer.ini

Error: “Javascript heap out of memory”

Section titled “Error: “Javascript heap out of memory””

Causa: Proceso Node.js excedió límite de RAM (default ~2GB en 64-bit).

Solución:

  1. Aumentar límite: --max-old-space-size=4096
  2. Buscar memory leaks (ver Troubleshooting Guide)

Causa: Loop infinito o proceso bloqueante.

Diagnóstico:

Terminal window
pm2 monit
# Identificar proceso
pidstat -p <PID> 1

Solución:

  • Si es tráfico legítimo: Escalar Hz (más instancias)
  • Si es bug: Reiniciar proceso y analizar logs / profile


FechaVersionCambios
2026-01-181.0Runbook inicial creado