Saltar a contenido

zram y Swap

Cuando un servidor se queda sin RAM, el kernel recurre al swap para seguir funcionando. Sin una buena configuración, eso puede provocar caídas de rendimiento o incluso la terminación de procesos. Esta guía explica cómo configurar dos mecanismos complementarios: zram (swap comprimido en memoria) y un swapfile en disco como red de seguridad.

zram

zram comprime la memoria en RAM para reducir el uso de swap en disco. Analiza la RAM disponible antes de decidir qué PERCENT usar (más útil cuanta menos RAM haya):

free -h
top -bn1 | head -20
  1. Comprobar si ya está instalado:

    dpkg -l | grep zram-tools
    
  2. Instalar:

    sudo apt install zram-tools
    
  3. Configurar:

    sudo vim /etc/default/zramswap
    

    Contenido (ajustar PERCENT según el análisis):

    ALGO=zstd
    PERCENT=50
    

     

    A diferencia de sshd_config.d/, sysctl.d/ o limits.d/, /etc/default/ no tiene mecanismo de drop-ins: zramswap no busca fragmentos adicionales, así que este es el único fichero de configuración que soporta el paquete — no hay forma de hacerlo en uno nuevo sin tocar este. Es la misma excepción que unattended-upgrades en el paso anterior.

  4. Aplicar y verificar:

    sudo service zramswap restart
    sudo zramctl
    

     

    zramctl vive en /usr/sbin, que no está en el PATH de un usuario normal — de ahí el sudo.

Swap

Usa el swapfile como red de seguridad adicional en disco. En vez de tocar /etc/fstab y /etc/sysctl.conf (ficheros de sistema ya existentes), la activación en el arranque se hace con una unidad de systemd y el ajuste de swappiness con un drop-in de sysctl — ambos ficheros nuevos. Analiza el disco y la RAM para decidir el tamaño del swapfile:

df -h /
free -h
  1. Comprobar si ya hay swap configurado:

    sudo swapon --show
    sudo systemctl list-units --type swap
    

     

    swapon también vive en /usr/sbin — hace falta sudo para encontrarlo como usuario normal. Este list-units y los systemctl daemon-reload/enable de abajo se quedan como systemctl: listar unidades o activarlas en el arranque son cosas que service no sabe hacer (solo envuelve start/stop/restart/reload/status).

  2. Si no hay, crear el swapfile (ajustar tamaño 2G según el análisis):

    sudo fallocate -l 2G /swapfile
    sudo chmod 600 /swapfile
    sudo mkswap /swapfile
    
  3. Crear una unidad de systemd para activarlo en el arranque:

    sudo vim /etc/systemd/system/swapfile.swap
    

    Contenido:

    [Unit]
    Description=Swapfile
    
    [Swap]
    What=/swapfile
    
    [Install]
    WantedBy=multi-user.target
    
  4. Activar y arrancar la unidad:

    sudo systemctl daemon-reload
    sudo systemctl enable --now swapfile.swap
    
  5. Ajustar swappiness (priorizar RAM/zram sobre el swapfile) con un drop-in propio:

    sudo vim /etc/sysctl.d/99-swap.conf
    

    Contenido:

    vm.swappiness=10
    

    Aplicar:

    sudo sysctl --system
    

    📝 Nota

    No todo se pudo sacar a fichero nuevo del todo "gratis" — la unidad swapfile.swap necesita systemctl daemon-reload para que systemd la detecte, y depende de que el servidor use systemd (estándar en Ubuntu, pero no universal). Si en algún momento tuvieras que volver al método clásico de /etc/fstab, sería la única excepción real a la convención de "solo ficheros nuevos" de esta guía.

  6. Verificar:

    sudo swapon --show
    sudo systemctl status swapfile.swap
    

     

    swapfile.swap es una unidad de tipo .swap, no .serviceservice no la reconoce, así que aquí también se queda systemctl.