Saltar a contenido

Configuración de Memoria Swap en Debian 11 (Producción)

✅ ESTADO ACTUALIZADO - SWAP 8GB CONFIGURADO

Servidor: desarrollo@debian-s-1vcpu-2gb-amd-nyc1-01 Memoria disponible: 287Mi de 3.8Gi total (mejora desde 108Mi) Memoria usada: 3.2Gi (84.2% de uso) Swap configurado: 8.0Gi (actualmente usando 1.1Gi) Archivo swap: /swapfile.new

ESTADO: Sistema estable con swap de 8GB operativo

Problema Identificado

Error: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away Causa: Memoria insuficiente en servidor de producción (87% usado, solo 119MB libres) Contexto: Job word:update-sql-server-module ejecutándose diariamente a las 6 AM

Estado Verificado del Sistema de Producción

Información del servidor de producción (desarrollo@debian-s-1vcpu-2gb-amd-nyc1-01):

# Distribución confirmada
$ lsb_release -a
Distributor ID: Debian
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
Codename:       bullseye

# Estado crítico de memoria
$ free -h
               total        used        free      shared  buff/cache   available
Mem:           3.8Gi       3.3Gi       123Mi       222Mi       419Mi       108Mi
Swap:             0B          0B          0B

# Confirmación: sin swap configurado
$ cat /proc/swaps
Filename                                Type            Size            Used            Priority
(vacío - sin swap configurado)

# Comando swapon no disponible
$ swapon --show
-bash: swapon: command not found

Estado CRÍTICO: Solo 108Mi disponibles de 3.8Gi total Problema Confirmado: Sin memoria swap configurada Impacto: Errores "MySQL server has gone away" durante jobs pesados como word:update-sql-server-module

Prerequisitos: Preparación del Servidor de Producción

Servidor: desarrollo@debian-s-1vcpu-2gb-amd-nyc1-01 Estado: swapon no disponible (comando no encontrado)

# 1. Conectar al servidor de producción
ssh desarrollo@debian-s-1vcpu-2gb-amd-nyc1-01

# 2. Verificar si util-linux está instalado
dpkg -l | grep util-linux

# 3. Instalar util-linux para obtener comandos swap
sudo apt update
sudo apt install util-linux

# 4. Verificar instalación exitosa
swapon --version

Comandos de verificación que ya funcionan en el servidor: - cat /proc/swaps - Ver archivos swap activos ✅ - grep -i swap /proc/meminfo - Ver información de swap ✅ - free -h - Ver memoria total incluyendo swap ✅

Solución: Configuración de Memoria Swap en Servidor de Producción

IMPORTANTE: Los siguientes comandos deben ejecutarse en el servidor de producción Debian 11, NO en el ambiente local de desarrollo.

Paso 1: Verificación Inicial del Sistema (Servidor de Producción)

# Conectar al servidor de producción primero
# ssh usuario@servidor-produccion

# Verificar memoria actual en producción
free -h

# Verificar si hay swap configurado (método principal)
cat /proc/swaps

# Método alternativo si swapon no está disponible
grep -i swap /proc/meminfo

# Instalar util-linux si swapon no está disponible
sudo apt update && sudo apt install util-linux

# Verificar espacio en disco disponible
df -h

# Verificar distribución
lsb_release -a

Paso 2: Crear Archivo Swap (2GB Recomendado para Servidor 4GB)

# Verificar espacio disponible en disco
df -h

# Crear archivo de 2GB para servidor de 4GB RAM (desarrollo@debian-s-1vcpu-2gb-amd-nyc1-01)
sudo fallocate -l 2G /swapfile

# Verificar que se creó correctamente
ls -lh /swapfile

Nota: Para el servidor actual con 3.8Gi RAM, 2GB swap es óptimo Alternativa si fallocate no está disponible:

sudo dd if=/dev/zero of=/swapfile bs=1024 count=2097152

Paso 3: Configurar Permisos de Seguridad

# Establecer permisos restrictivos (crítico para seguridad)
sudo chmod 600 /swapfile

# Verificar permisos correctos
ls -lh /swapfile
# Debe mostrar: -rw------- 1 root root 2.0G

Paso 4: Activar el Archivo Swap

# Marcar el archivo como área de swap
sudo mkswap /swapfile

# Activar el swap inmediatamente
sudo swapon /swapfile

# Verificar activación exitosa
# Método principal (si swapon está disponible)
swapon --show

# Método alternativo de verificación
cat /proc/swaps
free -h

Resultado esperado (con cat /proc/swaps):

Filename                Type        Size    Used    Priority
/swapfile               file        2097148 0       -2

O con swapon --show (si está disponible):

NAME      TYPE SIZE USED PRIO
/swapfile file   2G   0B   -2

Paso 5: Hacer Configuración Permanente

# Respaldar archivo fstab actual
sudo cp /etc/fstab /etc/fstab.backup.$(date +%Y%m%d)

# Agregar entrada swap permanente
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

# Verificar que se agregó correctamente
grep swap /etc/fstab

Optimización de Configuración Swap para Producción

Configurar Swappiness (Crítico para Servidores)

# Ver valor actual (por defecto 60)
cat /proc/sys/vm/swappiness

# Configurar valor óptimo para servidores de bases de datos (10-20)
echo 'vm.swappiness=15' | sudo tee -a /etc/sysctl.conf

# Aplicar configuración inmediatamente
sudo sysctl vm.swappiness=15

Valores recomendados: - 60 (default): Para desktops - 10-20: Para servidores de bases de datos - 15: Óptimo para DocuCenter con MySQL/MariaDB

Configurar Cache Pressure

# Configurar para optimizar cache de archivos
echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.conf

# Aplicar inmediatamente
sudo sysctl vm.vfs_cache_pressure=50

Configurar Dirty Ratio (Optimización de I/O)

# Configurar para escrituras más eficientes
echo 'vm.dirty_ratio=15' | sudo tee -a /etc/sysctl.conf
echo 'vm.dirty_background_ratio=5' | sudo tee -a /etc/sysctl.conf

# Aplicar configuración
sudo sysctl vm.dirty_ratio=15
sudo sysctl vm.dirty_background_ratio=5

Configuración MySQL/MariaDB para Memoria Optimizada

Optimizar Configuración de Base de Datos

Editar /etc/mysql/mariadb.conf.d/50-server.cnf:

[mysqld]
# === TIMEOUTS PARA JOBS LARGOS ===
wait_timeout = 28800                # 8 horas
interactive_timeout = 28800         # 8 horas
net_read_timeout = 300              # 5 minutos
net_write_timeout = 300             # 5 minutos

# === OPTIMIZACIÓN DE MEMORIA ===
innodb_buffer_pool_size = 1536M     # 40% de RAM disponible
innodb_buffer_pool_instances = 4    # Para buffer > 1GB
innodb_log_file_size = 256M         # 25% del buffer pool

# === LÍMITES DE CONEXIÓN ===
max_connections = 150               # Reducido para conservar memoria
max_allowed_packet = 256M           # Para queries grandes

# === OPTIMIZACIÓN DE QUERIES ===
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 32M

# === OPTIMIZACIÓN INNODB ===
innodb_flush_log_at_trx_commit = 2  # Mejor performance
innodb_flush_method = O_DIRECT      # Evita double buffering
innodb_file_per_table = 1           # Un archivo por tabla

Reiniciar Servicios

# Verificar configuración antes de reiniciar
sudo mysqld --help --verbose | grep -A 1 "Default options"

# Reiniciar MariaDB/MySQL
sudo systemctl restart mariadb

# Verificar estado del servicio
sudo systemctl status mariadb

# Verificar configuración aplicada
mysql -u root -p -e "SHOW VARIABLES LIKE 'wait_timeout';"
mysql -u root -p -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"

Monitoreo y Validación

Script de Monitoreo de Memoria

# Crear script de monitoreo
sudo tee /usr/local/bin/docucenter-memory-monitor.sh << 'EOF'
#!/bin/bash
LOGFILE="/var/log/docucenter-memory.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

echo "=== MONITOREO DOCUCENTER - $TIMESTAMP ===" >> $LOGFILE

# Información de memoria
echo "--- Memoria del Sistema ---" >> $LOGFILE
free -h >> $LOGFILE

echo "--- Uso de Swap ---" >> $LOGFILE
cat /proc/swaps >> $LOGFILE

# Si swapon está disponible, usar también:
# swapon --show >> $LOGFILE 2>/dev/null || echo "swapon no disponible" >> $LOGFILE

# Procesos PHP que más consumen memoria
echo "--- Top Procesos PHP ---" >> $LOGFILE
ps aux | grep php | grep -v grep | sort -k4 -nr | head -5 >> $LOGFILE

# Conexiones MySQL activas
echo "--- Conexiones MySQL ---" >> $LOGFILE
mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "SELECT COUNT(*) as conexiones_activas FROM information_schema.PROCESSLIST;" 2>/dev/null >> $LOGFILE

# Estadísticas de swap
echo "--- Estadísticas Swap ---" >> $LOGFILE
cat /proc/swaps >> $LOGFILE

echo "" >> $LOGFILE
EOF

sudo chmod +x /usr/local/bin/docucenter-memory-monitor.sh

Configurar Monitoreo Automático

# Agregar al crontab para monitoreo durante jobs críticos
sudo tee -a /etc/crontab << 'EOF'
# Monitoreo DocuCenter - Jobs SQL Server (6-8 AM)
*/15 6-8 * * * root /usr/local/bin/docucenter-memory-monitor.sh

# Monitoreo general cada hora
0 * * * * root /usr/local/bin/docucenter-memory-monitor.sh
EOF

# Reiniciar cron
sudo systemctl restart cron

Script de Validación Post-Instalación

# Crear script de validación
sudo tee /usr/local/bin/validate-swap-config.sh << 'EOF'
#!/bin/bash
echo "=== VALIDACIÓN CONFIGURACIÓN SWAP DOCUCENTER ==="

echo "1. Verificando memoria total:"
free -h

echo -e "\n2. Verificando swap activo:"
# Usar método que funciona en todos los sistemas
cat /proc/swaps

# Si swapon está disponible
if command -v swapon &> /dev/null; then
    echo "Usando swapon:"
    swapon --show
else
    echo "swapon no disponible, usando /proc/meminfo:"
    grep -i swap /proc/meminfo
fi

echo -e "\n3. Verificando configuración swappiness:"
echo "Actual: $(cat /proc/sys/vm/swappiness)"
echo "Recomendado: 15"

echo -e "\n4. Verificando entrada en fstab:"
grep swap /etc/fstab

echo -e "\n5. Verificando configuración MySQL:"
systemctl is-active mariadb
mysql -u root -p -e "SHOW VARIABLES LIKE 'wait_timeout';" 2>/dev/null | grep wait_timeout

echo -e "\n6. Verificando logs DocuCenter:"
ls -la /var/log/docucenter-memory.log

echo -e "\n=== VALIDACIÓN COMPLETA ==="
EOF

sudo chmod +x /usr/local/bin/validate-swap-config.sh

Validación de la Solución

Ejecutar Validación Completa

# Ejecutar script de validación
sudo /usr/local/bin/validate-swap-config.sh

# Probar job problemático manualmente
cd /home/desarrollo/code/docucenter
sudo -u www-data php artisan word:update-sql-server-module

# Monitorear durante ejecución
watch -n 10 'free -h && echo "=== SWAP ===" && cat /proc/swaps'

Verificación de Estado Óptimo

Memoria esperada después de configuración:

              total        used        free      shared  buff/cache   available
Mem:          3.8Gi       2.8Gi       0.5Gi        50Mi       500Mi       800Mi
Swap:         2.0Gi         0B       2.0Gi

Configuración MySQL verificada:

-- Verificar timeouts aumentados
SHOW VARIABLES LIKE 'wait_timeout';        -- Debe ser 28800
SHOW VARIABLES LIKE 'interactive_timeout'; -- Debe ser 28800

-- Verificar buffer pool
SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; -- Debe ser ~1.5GB

Mantenimiento y Monitoreo Continuo

Alertas de Memoria Crítica

# Script de alerta (ejecutar cada 5 minutos)
sudo tee /usr/local/bin/memory-alert.sh << 'EOF'
#!/bin/bash
THRESHOLD=90
MEMORY_USAGE=$(free | grep Mem | awk '{printf("%.0f", $3/$2 * 100.0)}')

if [ $MEMORY_USAGE -gt $THRESHOLD ]; then
    echo "ALERTA: Uso de memoria crítico: ${MEMORY_USAGE}%" | \
    logger -t "DocuCenter-Memory"

    # Opcional: enviar email o notificación
    # echo "Memoria crítica en servidor DocuCenter" | mail -s "Alerta Memoria" admin@empresa.com
fi
EOF

sudo chmod +x /usr/local/bin/memory-alert.sh

# Agregar al cron
echo "*/5 * * * * root /usr/local/bin/memory-alert.sh" | sudo tee -a /etc/crontab

Rotación de Logs

# Configurar rotación de logs de monitoreo
sudo tee /etc/logrotate.d/docucenter-memory << 'EOF'
/var/log/docucenter-memory.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 644 root root
}
EOF

Resultado Esperado

Después de implementar esta configuración:

  1. Memoria disponible: +8GB de swap como respaldo (actualizado desde 2GB)
  2. Timeouts MySQL: Extendidos para jobs largos (8 horas)
  3. Monitoreo: Alertas automáticas de uso de memoria
  4. Performance: Jobs SQL Server ejecutándose sin errores de conexión
  5. Estabilidad: Sistema más resistente a picos de memoria

Error resuelto: MySQL server has gone away durante ejecución de word:update-sql-server-module

✅ Validación Final - Swap 8GB Implementado

Fecha de Implementación: 29 de Octubre, 2025 Servidor: desarrollo@debian-s-1vcpu-2gb-amd-nyc1-01

Estado del Sistema Después de Actualización

$ cat /proc/swaps
Filename                Type      Size      Used      Priority
/swapfile.new          file    8388604   1126140           -2

$ free -h
               total        used        free      shared  buff/cache   available
Mem:           3.8Gi       3.2Gi       193Mi       155Mi       465Mi       287Mi
Swap:          8.0Gi       1.1Gi       6.9Gi

$ grep swap /etc/fstab
/swapfile.new none swap sw 0 0

Mejoras Confirmadas

Métrica Antes Después Mejora
Memoria disponible 108Mi 287Mi +165%
Swap configurado 0-2GB 8GB +300-800%
Swap en uso N/A 1.1Gi Activo
Estado del sistema Crítico Estable

Características de la Implementación

  • Sin reinicio: Migración realizada con servidor en producción
  • Zero downtime: Método dual-swap evitó interrupciones
  • Persistente: Configuración en fstab garantiza permanencia
  • Optimizado: Swappiness=15 configurado para bases de datos
  • Monitoreado: Scripts de monitoreo activos

Validación de Funcionalidad

# Swap siendo usado activamente por el sistema
$ cat /proc/swaps | grep swapfile.new
/swapfile.new          file    8388604   1126140           -2

# Sistema usando swap para aliviar presión de memoria
# 1.1Gi de swap en uso indica que el sistema está trabajando correctamente

Estado: Sistema de producción estabilizado con swap de 8GB completamente funcional.

🚀 PLAN DE IMPLEMENTACIÓN RÁPIDA

Implementación Inmediata (5 minutos)

# 1. Conectar al servidor crítico
ssh desarrollo@debian-s-1vcpu-2gb-amd-nyc1-01

# 2. Verificar espacio disponible
df -h

# 3. Crear swap inmediatamente (2GB)
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 4. Verificar activación inmediata
cat /proc/swaps
free -h

# 5. Hacer permanente
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

# 6. Optimizar para servidor de DB
echo 'vm.swappiness=15' | sudo tee -a /etc/sysctl.conf
sudo sysctl vm.swappiness=15

Verificación de Éxito

# Estado esperado después de implementación:
$ free -h
               total        used        free      shared  buff/cache   available
Mem:           3.8Gi       2.8Gi       800Mi       222Mi       419Mi       1.2Gi
Swap:          2.0Gi         0B       2.0Gi

# Swap activo confirmado:
$ cat /proc/swaps
Filename                Type      Size      Used    Priority
/swapfile              file    2097148        0          -2

Próximo Paso Crítico

Ejecutar inmediatamente en servidor de producción para resolver crisis de memoria y prevenir fallos del sistema durante jobs de SQL Server.


🔄 Actualización Segura de Swap (2GB → 8GB)

Escenario: Actualizar Swap Sin Reinicio en Servidor con Memoria Crítica

Contexto: Servidor con memoria crítica (<10% libre) donde swapoff falla por OOM killer.

Método Dual-Swap: Crear nuevo swap sin desactivar el existente, luego migrar.

Paso 1: Verificar Estado Actual

# Verificar memoria y swap actuales
free -h
cat /proc/swaps
grep swap /etc/fstab

# Resultado esperado (antes de actualización):
# Mem:  3.8Gi total, 3.3Gi usado, 108Mi disponible
# Swap: 2.0Gi (o posiblemente 0B si swap original fue eliminado)

Paso 2: Crear Nuevo Swap de 8GB (Sin Desactivar el Actual)

# 1. Verificar espacio en disco
df -h

# 2. Crear archivo swap de 8GB con nombre temporal
sudo fallocate -l 8G /swapfile.new

# 3. Configurar permisos restrictivos
sudo chmod 600 /swapfile.new

# 4. Marcar como área de swap
sudo mkswap /swapfile.new

# 5. Activar el nuevo swap (ahora tendrás 2GB + 8GB = 10GB total)
sudo swapon /swapfile.new

# 6. Verificar que ambos swaps están activos
cat /proc/swaps
free -h

Resultado esperado (dual-swap activo):

Filename                Type      Size      Used    Priority
/swapfile              file    2097148        0          -2
/swapfile.new          file    8388604        0          -2

Paso 3: Migrar a Swap Único de 8GB

Opción A: Si el archivo /swapfile original existe:

# 1. Intentar desactivar swap original
sudo swapoff /swapfile

# 2. Si el comando anterior falla con "Killed", el sistema tiene demasiada presión
# En ese caso, continuar con Opción B

# 3. Si swapoff tuvo éxito, eliminar el archivo viejo
sudo rm /swapfile

# 4. Renombrar el nuevo swap
sudo mv /swapfile.new /swapfile

# 5. Actualizar fstab
sudo cp /etc/fstab /etc/fstab.backup.$(date +%Y%m%d_%H%M%S)
sudo sed -i 's|/swapfile.new none swap sw 0 0|/swapfile none swap sw 0 0|g' /etc/fstab

Opción B: Si /swapfile no existe o swapoff falla (CASO COMÚN):

# 1. Actualizar fstab para apuntar al nuevo archivo directamente
sudo cp /etc/fstab /etc/fstab.backup.$(date +%Y%m%d_%H%M%S)
sudo sed -i 's|/swapfile none swap sw 0 0|/swapfile.new none swap sw 0 0|g' /etc/fstab

# 2. Verificar cambio en fstab
grep swap /etc/fstab
# Debe mostrar: /swapfile.new none swap sw 0 0

# 3. Verificar que el sistema está usando el nuevo swap
cat /proc/swaps
free -h

Paso 4: Validación Final

# Verificar configuración completa
echo "=== FSTAB ==="
grep swap /etc/fstab

echo -e "\n=== SWAP ACTIVO ==="
cat /proc/swaps

echo -e "\n=== MEMORIA TOTAL ==="
free -h

echo -e "\n=== SWAPPINESS ==="
cat /proc/sys/vm/swappiness

Estado esperado después de migración:

$ grep swap /etc/fstab
/swapfile.new none swap sw 0 0

$ cat /proc/swaps
Filename                Type      Size      Used    Priority
/swapfile.new          file    8388604   1126140          -2

$ free -h
               total        used        free      shared  buff/cache   available
Mem:           3.8Gi       3.2Gi       193Mi       155Mi       465Mi       287Mi
Swap:          8.0Gi       1.1Gi       6.9Gi

Resultado de la Actualización

Antes: - Memoria disponible: 108Mi (crítico) - Swap: 2GB o 0B - Riesgo: OOM killer activo

Después: - Memoria disponible: 287Mi (mejorado 165%) - Swap: 8GB activo (usando 1.1Gi) - Estado: Sistema estable con respaldo suficiente

Notas Importantes

  1. Dual-Swap Temporal: Es seguro tener dos archivos swap activos simultáneamente durante la migración
  2. OOM Killer: Si swapoff falla con "Killed", simplemente mantén el nuevo archivo /swapfile.new
  3. Reinicio NO Requerido: Todo el proceso se realiza sin reiniciar el servidor
  4. fstab: Asegúrate de que apunte al archivo swap correcto para persistencia después de reinicios
  5. Monitoreo: El sistema comenzará a usar el nuevo swap inmediatamente según necesidad

Comandos de Verificación Rápida

# Ver swap activo y uso actual
cat /proc/swaps && echo "---" && free -h | grep Swap

# Verificar que fstab está correcto para próximo reinicio
grep swap /etc/fstab

# Monitorear uso de swap en tiempo real
watch -n 5 'cat /proc/swaps && echo "---" && free -h'

Próximo Paso Crítico (COMPLETADO)