¿Necesita swap su VPS? Cómo calcular su tamaño
La mayoría de imágenes cloud no incluyen swap. Aprenda cuándo un VPS pequeño necesita un archivo, qué tamaño usar, cómo ajustar vm.swappiness y cuándo conviene zram.
¿Necesita swap su VPS?
La mayoría de las imágenes de proveedores cloud se distribuyen sin swap. En un VPS pequeño, normalmente la respuesta es sí: añada un archivo de swap. El swap no hace que un servidor de 1 GB se comporte como uno de 2 GB. Proporciona al kernel un lugar donde colocar páginas anónimas inactivas. Esto mantiene útil la caché de páginas y hace que el OOM killer (out of memory killer, la rutina del kernel que selecciona un proceso y lo termina para liberar memoria) sea el último recurso, en lugar del primero.
La versión resumida es la siguiente: en un servidor que ejecuta varios servicios de larga duración, un archivo de swap pequeño compensa el espacio de disco que ocupa. En un servidor donde un proceso intenta asignar regularmente más memoria de la disponible en toda la máquina, el swap no lo salvará. Además, hará que el fallo sea más lento y difícil de detectar. El resto de esta guía explica cómo distinguir ambos casos y cuáles son los dos costes que sólo aparecen en un VPS.
Todos los comandos siguientes necesitan permisos de root en su propio servidor. Ejecútelos allí en lugar de copiar la salida del servidor de otra persona.
Qué hace realmente swap y qué no hace
La memoria de Linux tiene dos tipos de páginas. Las páginas respaldadas por archivos son copias de elementos que ya existen en el disco: los programas y todos los archivos que se han leído recientemente. Ese conjunto es la caché de páginas. Las páginas anónimas no tienen ningún archivo asociado: incluyen el heap y la pila, además de la mayor parte de la memoria que una base de datos asigna durante su ejecución.
Cuando la memoria escasea, el kernel debe recuperar páginas. Una página limpia respaldada por un archivo se puede recuperar fácilmente, porque la copia del disco sigue disponible y la página se puede volver a leer más adelante. Una página anónima no, porque su única copia está en la RAM. Sin swap, el kernel tiene dos opciones para la memoria anónima: conservarla o terminar el proceso que la posee.
Un servidor sin swap sigue paginando. Simplemente pagina la memoria equivocada. Bajo presión, el kernel reduce la caché de páginas y expulsa páginas de archivos que pronto volverá a necesitar, incluido el código ejecutable de los programas en ejecución. Esas páginas vuelven a cargarse como fallos de página mayores. Se observan lecturas de disco en la columna bi de vmstat y un contador pgmajfault que aumenta en /proc/vmstat, mientras si y so permanecen en cero todo el tiempo. El servidor está en thrashing y los contadores de swap no muestran nada.
Lo que swap no hace es aumentar la capacidad. Si el conjunto de trabajo, es decir, las páginas que se están utilizando realmente, es mayor que la RAM, swap convierte una terminación por falta de memoria en un servidor muy lento. A veces ese es el intercambio que se busca, porque se puede acceder a un servidor lento y repararlo, mientras que no se puede hacer lo mismo con una base de datos terminada. A veces es peor, porque un servidor lento sigue fallando las comprobaciones de estado mientras mantiene abiertas todas las conexiones. Decida qué comportamiento necesita antes de añadir swap.
¿Por qué las imágenes cloud se publican sin swap?
Es una decisión deliberada. Una misma imagen debe arrancar en todos los planes que ofrece un proveedor, por lo que una partición swap fija desperdiciaría disco en los planes pequeños y no aportaría nada en los grandes. La velocidad de swap también depende del almacenamiento subyacente de la máquina virtual, un dato que la imagen no puede conocer de antemano. Además, quienes crean las imágenes optimizan el comportamiento predecible, porque un proceso que termina de inmediato es más fácil de diagnosticar en toda una flota que una máquina que sigue activa y responde a cada solicitud con varios segundos de retraso.
Esos motivos se aplican a máquinas desechables. Un VPS que se conserva es diferente. En lugar de reemplazarlo, se repara, por lo que unos segundos de paginación suelen ser preferibles a que un servicio termine. Considere la ausencia de swap como una configuración predeterminada diseñada para el caso de uso de otra persona.
¿Archivo de swap o partición de swap en un VPS?
Use un archivo. Una partición implica cambiar el tamaño de un sistema de archivos root activo en un disco que ya viene particionado. Es un riesgo real sin ninguna ventaja. Un archivo se crea y se elimina con comandos normales. Además, puede cambiar su tamaño más adelante sin modificar la tabla de particiones.
La velocidad no es un factor decisivo. En el momento swapon, el kernel lee una vez el mapa de extensiones del archivo y después envía la E/S directamente al dispositivo de bloques. Por tanto, el sistema de archivos no interviene en cada operación de entrada y salida de páginas. En el mismo disco, un archivo de swap y una partición de swap ofrecen el mismo rendimiento.
Conviene conocer dos limitaciones. No coloque swap en un sistema de archivos de red, como NFS (network file system). En btrfs, el archivo debe tener desactivadas la copia en escritura y la compresión. Por eso btrfs incluye su propio helper para crearlo.
Cómo añadir un archivo de swap en Ubuntu o Debian
Compruebe lo que existe antes de cambiar nada.
swapon --show
free -h
findmnt -no FSTYPE /Una salida vacía de swapon --show significa que no hay swap, que es el estado normal de una imagen cloud recién creada. findmnt muestra el tipo del sistema de archivos raíz, y eso determina cómo se crea el archivo. En ext4, que es lo que usan la mayoría de las imágenes cloud, fallocate es seguro.
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfilechmod debe ejecutarse antes que mkswap deliberadamente. Si lo omite, mkswap se lo indica: mkswap: /swapfile: insecure permissions 0644, fix with: chmod 0600 /swapfile. Un archivo de swap legible para todos entrega a cada usuario del equipo la memoria que otros procesos paginaron. Un mkswap correcto confirma después el tamaño, con una línea como Setting up swapspace version 1, size = 2 GiB (2147479552 bytes).
En xfs o btrfs, el último comando puede fallar con swapon: /swapfile: swapon failed: Invalid argument. En XFS ocurre porque fallocate deja extensiones sin escribir, por lo que debe escribir los bytes directamente.
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progressEn btrfs, la causa es copy on write, y la versión actual de btrfs-progs establece los flags correctos automáticamente.
sudo btrfs filesystem mkswapfile --size 2g /swapfileEn cualquier caso, termine con chmod 600, mkswap cuando corresponda y swapon. Después, confirme el resultado.
swapon --show
free -hswapon --show debe mostrar /swapfile con el tipo file y el tamaño solicitado, y free -h debe mostrar una fila Swap con casi nada en uso. Cero swap en uso en una configuración nueva es correcto. El kernel sólo mueve páginas allí cuando tiene un motivo.
Haga que sobreviva a un reinicio y pruebe la entrada de inmediato.
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
sudo swapoff /swapfile
sudo swapon -a
swapon --showswapon -a lee /etc/fstab, por lo que una línea incorrecta falla ahora, delante de usted. Un error tipográfico que nunca prueba se convierte en un error que encuentra durante un reinicio no planificado, cuando el equipo vuelve a arrancar sin el swap que creía tener.
Para eliminar el swap más adelante, ejecute sudo swapoff /swapfile, borre la línea de fstab y después ejecute sudo rm /swapfile. swapoff debe volver a cargar primero en la RAM todas las páginas paginadas, por lo que en un equipo con mucha carga puede fallar con swapoff: /swapfile: swapoff failed: Cannot allocate memory. Libere memoria y vuelva a intentarlo.
¿Qué tamaño debe tener el archivo de swap?
El proceso mantiene páginas anónimas inactivas, por lo que lo importante es cuánta memoria asignada está realmente inactiva, no cuánta RAM incluye el plan. La memoria inactiva no aumenta al mismo ritmo que el tamaño del plan, por lo que el multiplicador disminuye a medida que los planes son más grandes. Esta es la regla que utiliza esta guía.
The data behind this chart
[
{
"label": "1 GB plan",
"swap_gb": 2,
"swap_x_ram": 2
},
{
"label": "2 GB plan",
"swap_gb": 2,
"swap_x_ram": 1
},
{
"label": "4 GB plan",
"swap_gb": 2,
"swap_x_ram": 0.5
},
{
"label": "8 GB plan",
"swap_gb": 4,
"swap_x_ram": 0.5
},
{
"label": "16 GB plan",
"swap_gb": 4,
"swap_x_ram": 0.25
}
]En el plan más pequeño hay 2 GB de swap, es decir, 2 veces la RAM, porque un servidor de 1 GB tiene tan poco margen que un solo pico puede activar el OOM killer. En la parte superior de la tabla, el archivo se limita a 4 GB, o 0.25 veces la RAM, porque paginar tantos datos en almacenamiento compartido tarda lo suficiente como para que el servidor quede prácticamente fuera de servicio durante el proceso. Reduzca estas cifras si el espacio disponible en disco es limitado, ya que el archivo consume espacio real en disco.
El único motivo clásico para configurar el swap con un tamaño igual o superior al de la RAM es la hibernación, que escribe toda la imagen de memoria en el swap. Un VPS no hiberna, por lo que esa regla no se aplica en este caso.
¿Qué cambia realmente vm.swappiness?
vm.swappiness no es un porcentaje de la RAM ni un umbral. Es el coste relativo que el kernel asigna a recuperar páginas anónimas frente a páginas de archivos. El valor predeterminado es 60. Si lo reduce, el kernel prefiere descartar la caché de páginas. Si lo aumenta, prefiere paginar la memoria anónima a swap.
Es una decisión con costes en ambos sentidos. Con vm.swappiness = 10, una base de datos mantiene más asignaciones en memoria y lo compensa volviendo a leer los archivos que acaba de descartar de la caché. En un servidor cuyo trabajo principal es servir archivos, esa decisión es incorrecta, porque la caché de páginas es la que proporciona el rendimiento útil.
Establecerlo en 0 no desactiva swap. Indica al kernel que evite recuperar memoria anónima hasta que quede casi sin memoria, lo que hace que el OOM killer actúe antes en lugar de retrasarlo. Si no quiere usar swap, elimine el archivo de swap.
sysctl vm.swappiness
printf 'vm.swappiness = 10\n' | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl --system
sysctl vm.swappinessUn sysctl -w sin más dura hasta el siguiente reinicio y después deja de aplicarse silenciosamente, por lo que debe escribir el valor en el archivo de /etc/sysctl.d/. Los kernels desde la versión 5.8 aceptan valores de 0 a 200. Los valores superiores a 100 sólo tienen sentido cuando swap es casi tan rápido como la RAM, lo que requiere zram.
zram: swap que consume CPU en lugar de disco
zram es un dispositivo de bloques comprimido que reside en la RAM. Puede usarlo como swap: una página que habría ido al disco se comprime y permanece en memoria. No hay E/S de disco ni se consume cuota de disco. El coste es tiempo de CPU en cada operación de entrada y salida de páginas, además de la RAM que contiene las páginas comprimidas y que sus aplicaciones ya no pueden utilizar.
Para las páginas anónimas, las cifras publicadas habitualmente son relaciones de compresión de entre 2:1 y 3:1. zramctl muestra su relación real en las columnas DATA y COMPR. Mida el valor en lugar de planificar basándose en la cifra habitual, porque algunas cargas de trabajo contienen datos que apenas se pueden comprimir.
sudo apt install zram-toolsEstablezca ALGO=zstd y PERCENT=25 en /etc/default/zramswap. Después, reinicie el servicio y compruebe el resultado.
sudo systemctl restart zramswap
zramctl
swapon --showPERCENT es una proporción de la RAM total. Por tanto, el valor 25 en un equipo con 4 GB reserva hasta 1 GB para las páginas comprimidas. Empiece con un valor bajo y auméntelo sólo si zramctl muestra que el dispositivo se está llenando. El ajuste PRIORITY del mismo archivo determina qué swap llena primero el kernel: gana la prioridad más alta. Un archivo de swap de disco añadido con swapon sin opciones recibe una prioridad negativa, por lo que zram se utiliza primero y el archivo absorbe el exceso. swapon --show muestra ambas prioridades en su columna PRIO. En las distribuciones que usan systemd-zram-generator en lugar de zram-tools, los mismos ajustes se encuentran en /etc/systemd/zram-generator.conf.
zram es adecuado para un equipo con capacidad de CPU disponible y poco espacio de disco libre. Es una mala elección cuando la CPU es el recurso que ya está limitado, porque el trabajo de compresión compite con la aplicación por la misma capacidad.
Dos trampas de swap que sólo afectan a una VPS
La primera trampa es el disco. Un archivo de swap de 2 GB consume 2 GB del disco de su plan en cuanto lo crea, porque el espacio debe asignarse por adelantado. df -h / disminuye inmediatamente en la cantidad total y no se recupera hasta que elimina el archivo. En un plan pequeño, representa una parte apreciable, y un sistema de archivos root lleno provoca muchos más problemas de los que swap puede resolver. El archivo también aparece en la salida de du. Téngalo en cuenta cuando busque espacio y df y du no coinciden sobre dónde se ha usado el disco.
La segunda trampa es la latencia. La E/S de swap utiliza el almacenamiento que el host comparte con sus otros invitados, y desde su invitado no puede ver la carga de esos otros sistemas. Sólo observa el efecto: una página que normalmente entra con rapidez a veces tarda mucho más, y el proceso que espera por ella se detiene hasta que llega la página. Es el mismo razonamiento que el tiempo de CPU steal en un host compartido, aplicado a la cola de disco en lugar de la cola de ejecución. Mídalo en su propio sistema, porque cualquier cifra de latencia publicada describe a los vecinos de otra máquina.
¿Cómo saber si el uso de swap está perjudicando al sistema?
El swap utilizado no es un problema. El tráfico de swap sí lo es. Un servidor con varios cientos de megabytes almacenados en swap y sin actividad de paginación simplemente ha movido memoria que no se ha utilizado durante horas. Ese es el resultado esperado.
Observe las tasas en lugar de los totales.
vmstat 1 5si y so son los kibibytes por segundo que se intercambian hacia dentro y hacia fuera. En un sistema sano se mantienen en cero o cerca de cero, independientemente de lo que indique la columna swpd. Un valor de so sostenido, con si aumentando al mismo tiempo, significa que las páginas se están escribiendo y recuperando inmediatamente. Eso es thrashing.
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 3 1048572 38210 4096 61440 912 1180 2210 1290 1402 2890 9 7 12 72 0Ese ejemplo muestra un sistema con problemas. La señal más clara no está en las columnas de swap. Está en wa, con un valor de 72, lo que significa que la CPU pasó la mayor parte del tiempo esperando E/S, y en b, con un valor de 3, lo que significa que hay tres procesos bloqueados.
PSI (pressure stall information) responde a la pregunta de forma más directa.
cat /proc/pressure/memorysome avg10=8.42 avg60=5.11 avg300=2.03 total=1284729
full avg10=3.10 avg60=1.94 avg300=0.71 total=498210some avg10=8.42 significa que, durante los últimos 10 segundos, al menos una tarea estuvo bloqueada esperando memoria durante el 8.42 por ciento del tiempo. full cuenta el tiempo durante el que todas las tareas que no estaban inactivas estuvieron bloqueadas. Por tanto, un valor de full sostenido representa un daño medible, no una simple señal de advertencia. Si el archivo no existe, el kernel tiene PSI deshabilitado de forma predeterminada y necesita psi=1 en la línea de comandos del kernel.
Para ver qué procesos mantienen páginas en swap:
sudo awk '/^Name:/{n=$2} /^VmSwap:/ && $2+0 > 0 {printf "%10d kB %s\n", $2, n}' /proc/[0-9]*/status | sort -rn | headY para comprobar si OOM killer ya ha intervenido:
sudo journalctl -k --grep "Out of memory"Un impacto aparece como Out of memory: Killed process 2199 (mysqld) total-vm:1275860kB, anon-rss:129252kB, file-rss:0kB, shmem-rss:0kB, UID:114 pgtables:504kB oom_score_adj:0, y el registro del servicio para ese mismo segundo indica Main process exited, code=killed, status=9/KILL. Si ha visto esas líneas en un sistema sin swap, añadir un archivo de swap es la opción más económica que puede probar a continuación.
Cuándo swap es la solución equivocada
Swap da margen cuando la presión de memoria es temporal o afecta a páginas poco utilizadas. No sirve para un proceso que crece hasta morir. Además, hace que ese fallo sea más difícil de supervisar, porque la máquina pasa minutos adicionales moviendo páginas en lugar de fallar rápido y reiniciarse.
Limite el proceso. Un servicio de systemd admite MemoryMax= y MemorySwapMax= en un archivo drop-in. Así puede limitar la memoria y la CPU de un servicio con systemd sin modificar la aplicación. Los contenedores ofrecen los mismos controles en un nivel superior. Configurarlos permite evitar que un servicio de Compose consuma todos los recursos del servidor. En ambos casos, el registro muestra una terminación identificable, en lugar de dejar que el kernel elija la víctima según su puntuación.
Hágalo cuando el servidor sea nuevo y esté sin carga. Crear el archivo de swap y establecer un límite de memoria lleva unos minutos. Estas tareas forman parte del trabajo de los primeros diez minutos en un VPS nuevo.
FAQ
¿Añadir swap hace que mi VPS de 1 GB funcione como uno de 2 GB?
No. La swap es mucho más lenta que la RAM, y el kernel sólo mueve allí las páginas que considera inactivas. Lo que proporciona es margen para los picos y un lugar donde almacenar memoria que se asignó pero que después nunca volvió a utilizarse. Si la carga lee y escribe activamente más memoria de la disponible en el equipo, la swap convierte un cierre por falta de memoria en paginación constante. El servidor sigue activo, pero responde con tanta lentitud que deja de ser utilizable. En ese caso, añada RAM o limite el proceso que sigue creciendo.
¿Cuánta swap necesita un VPS de 1 GB o 2 GB?
2 GB cubren ambos casos, y después de esa cantidad no es necesario seguir aumentándola junto con la RAM. La swap almacena páginas anónimas inactivas, y la cantidad de memoria realmente inactiva de un servidor no crece al mismo ritmo que la RAM total. La antigua regla de usar el doble de la RAM procede de la hibernación, que escribe en disco toda la imagen de memoria, pero un VPS nunca hiberna. Superar 4 GB sólo suele comprar un fallo más largo y lento en un almacenamiento que comparte con otros huéspedes.
¿Establecer vm.swappiness en 0 es la forma correcta de detener el uso de swap?
No, y no hace lo que su nombre sugiere. vm.swappiness = 0 no desactiva la swap. Indica al kernel que evite recuperar páginas anónimas hasta que esté cerca de quedarse sin memoria, lo que hace más probable un cierre por falta de memoria, no menos. También desplaza toda la recuperación a la caché de páginas, por lo que las lecturas de archivos vuelven al disco con más frecuencia. Si no quiere usar swap, ejecute sudo swapoff -a y elimine la línea correspondiente de fstab. Si quiere reducir el uso de swap, pruebe vm.swappiness = 10 y compare las columnas si y so de vmstat antes y después.
¿Debo usar zram en lugar de un archivo de swap?
Use zram cuando tenga margen de CPU y poco espacio libre en disco. Use un archivo de swap cuando ocurra lo contrario. zram comprime las páginas y las mantiene en la RAM, por lo que evita por completo la E/S de disco, a cambio de consumir CPU en cada entrada y salida de una página. Además, el espacio que ocupa es RAM que las aplicaciones ya no pueden utilizar. En un VPS con una asignación de CPU reducida, ese coste recae sobre el recurso que ya es escaso. Es normal usar ambos: dé a zram una prioridad mayor con PRIORITY en /etc/default/zramswap y mantenga debajo un archivo de swap en disco para los desbordamientos.
¿Por qué se ejecutó el OOM killer cuando free mostró que había memoria disponible?
free muestra una situación puntual, mientras que una asignación ocurre en un instante. Un proceso que solicita un bloque grande más rápido de lo que la recuperación puede liberar memoria puede ser terminado aunque el promedio pareciera suficiente. Lea el registro del kernel con sudo journalctl -k --grep "Out of memory". Allí se indican el proceso terminado y su tamaño residente en ese momento. Después, compruebe si el cierre se debió a un límite de cgroup y no al equipo completo. Un contenedor o una unidad de systemd con MemoryMax= establecido se termina al alcanzar su propio límite, aunque el host todavía tenga memoria libre.