¿Cómo añadir Swap en Ubuntu y CentOS?

Actualizado el 12 de agosto, 2016. Por BlueHosting.

Una de las formas más sencillas de aumentar la capacidad de respuesta de su servidor y protegerlo contra errores de memoria insuficiente en sus aplicaciones es añadir un espacio swap. Swap, o espacio de intercambio, es un área del disco duro que fue designada como un espacio donde el sistema operativo puede almacenar datos que ya no puede retener en la memoria RAM.

Introducción

Swap ofrece, básicamente, la capacidad de aumentar la cantidad de información que su servidor puede mantener en su "memoria" en funcionamiento, con algunas limitaciones. El espacio en el disco duro será usado principalmente cuando el espacio de la memoria RAM ya no sea suficiente para los datos.

La información escrita en el disco será más lenta que la información mantenida en la memoria RAM, pero el sistema operativo preferirá mantener los datos de la aplicación en ejecución en la memoria y usar swap para los datos antiguos. En general, es una buena práctica tener un espacio swap de reserva para cuando la memoria RAM de su sistema se agote.

En esta guía, se cubrirá cómo crear y habilitar un archivo swap en un servidor con Ubuntu o CentOS (los Sistemas Operativos y versiones en las cuales se hicieron las pruebas de este tutorial son: Ubuntu 14.04 y CentOS 6.x).

Nota:
Swap se recomienda generalmente para sistemas que utilizan discos duros de rotación tradicional; sin embargo, usar swap con discos SSD puede causar problemas de degradación de hardware con el tiempo. Debido a esta consideración, no recomendamos habilitar swap si su proveedor utiliza almacenamiento SSD. Hacerlo puede impactar el desempeño del hardware subyacente para usted y sus vecinos.

Si usted necesita mejorar el desempeño de su servidor, recomendamos actualizarlo. Esto conllevará a mejores resultados generales y disminuirá la probabilidad de contribuir con problemas de hardware que puedan afectar su servicio.

Verifique la información de Swap en el sistema

Antes de comenzar, daremos un vistazo a nuestro sistema operativo para verificar si ya tenemos un espacio swap disponible. Podemos tener varios archivos o particiones swap, pero se recomienda -y es suficiente- tener solo una.

Podemos ver si el sistema tiene algún espacio swap activo ejecutando el siguiente comando:

sudo swapon -s

El resultado tendrá la forma:

Filename   Type   Size   Used   Priority

Si usted solo obtiene la cabecera de la tabla, tal como se muestra arriba, entonces no tiene un espacio swap habilitado actualmente.

Otra forma más común de comprobar si hay un espacio swap es la utilidad free, la cual muestra el uso de memoria del sistema. Podemos ver nuestra memoria actual y el uso del espacio swap en Megabytes ingresando el comando:

free -m

El resultado será similar a lo siguiente:

                    total    used      free     shared    buffers     cached
Mem:                490      411       78          0         42        215
-/+ buffers/cache:           153       336
Swap:               0        0         0

Tal como puede ver arriba, nuestro espacio swap total en el sistema es "0". Esto coincide con lo que vimos previamente usando swapon.

Verificar el espacio disponible en la partición del disco duro

La forma típica de asignar espacio para swap es usar una partición separada dedicada a esta tarea. Sin embargo, alterar el esquema de particiones no siempre es posible. Podemos entonces crear fácilmente un archivo swap que resida en una partición existente.

Antes de hacerlo, debemos estar al tanto de nuestro uso de disco actual. Podemos obtener esta información usando:

df -h

El resultado se asemejará a lo siguiente:

Filesystem      Size  Used Avail Use% Mounted on
/dev/vda         20G  1.7G   17G  10% /
tmpfs           246M     0  246M   0% /dev/shm

Tal como se observa en la primera línea, nuestra partición de disco duro tiene 17 Gigabytes disponibles, así que tenemos suficiente espacio para trabajar. Este es el caso de un servidor VPS pequeño y reciente, sin embargo, su uso real podría ser diferente.

Aunque hay muchas opiniones con respecto al tamaño apropiado para un espacio swap, realmente depende de sus preferencias personales y de los requisitos de su aplicación. Si no tiene idea de cuánto asignar a su espacio swap, un buen punto de partida es asignarle un valor igual o del doble de la memoria RAM de su sistema.

Debido a que el sistema del ejemplo tiene 0.5 Gigabytes de RAM (490 Megabytes, para ser más exactos), podemos colocar entre 0.5 y 1 GB de espacio swap, en nuestro caso 1 GB no representa una cantidad muy abrumadora del disco duro, así que podemos continuar con este valor.

No obstante, suponga que nuestra memoria RAM es mayor (por ejemplo: 2 GB), en este caso no sería conveniente asignar el doble de la memoria al espacio swap ya que estaríamos ocupando una parte muy significativa del disco duro.

Crear un archivo Swap

Ahora que conocemos nuestro espacio disponible en el disco duro, podemos continuar con la creación de nuestro archivo swap en nuestro filesystem.

Crearemos un archivo llamado swapfile en nuestro directorio raíz (/). Este archivo debe contener la cantidad de espacio que queremos para nuestro archivo swap. Hay dos métodos principales para hacer esto:

Método tradicional: más lento

Tradicionalmente, crearíamos un archivo con espacio preasignado usando el comando dd. Esta utilidad de disco versátil escribe de una ubicación a otra.

Podemos usar esto para escribir ceros en el archivo desde un dispositivo especial en los sistemas Linux ubicado en /dev/zero que simplemente llena el archivo de tanto ceros como sea necesario.

Especificamos el tamaño del archivo usando una combinación de bs para los tamaños de bloque y count para el número de bloques. Lo que asignamos a cada parámetro es casi completamente arbitrario. Lo que importa es el resultado o producto de multiplicar ambos parámetros.

Por ejemplo, en nuestro caso, queremos crear un archivo de 1 Gigabyte. Podemos hacer esto especificando un tamaño de bloque de 256 Megabytes y un count de 4:

sudo dd if=/dev/zero of=/swapfile bs=256M count=4
4+0 records in
4+0 records out
1073741824 bytes (1.1 GB) copied, 15.6076 s, 68.8 MB/s

Verifique muy bien el comando antes de presionar ENTER porque este comando tiene el potencial de destruir sus datos si usted apunta el parámetro of (que representa el archivo de salida) a una ubicación incorrecta.

Podemos ver que se han asignado 4 Gigabytes ingresando el comando:

ls -lh /swapfile
-rw-r--r-- 1 root root 1.0G Aug 13 18:24 /swapfile

Si usted ha completado el comando anterior podrá darse cuenta de que puede tomar cierto tiempo. De hecho, puede ver en la salida, que el sistema tomó 15.6 segundos para crear el archivo. Esto es debido a que el sistema tiene que escribir 1 Gigabyte de "ceros" en el disco, piénselo: ¡son más de ocho mil millones de ceros!

Si desea aprender cómo crear este archivo más rápidamente, elimínelo y siga el método descrito en la siguiente sección de este manual:

sudo rm /swapfile

Método rápido

La forma más rápida de obtener el mismo archivo es usando el programa fallocate. Este comando crea un archivo de un tamaño preasignado instantáneamente, sin la necesidad de escribir contenido de prueba.

Podemos crear un archivo de 1 Gigabyte ingresando el comando:

sudo fallocate -l 1G /swapfile

Podrá notar que el cursor en la línea de comandos volverá a aparecer casi inmediatamente. Podemos verificar la cantidad correcta de espacio que fue reservada ingresando:

ls -lh /swapfile
-rw-r--r-- 1 root root 1.0G Aug 13 18:34 /swapfile

Como puede ver, nuestro archivo fue creado con la cantidad correcta de espacio reservado y de forma muy rápida.

Habilitar el archivo Swap

Hasta este punto, solo hemos creado un archivo, pero nuestro sistema no sabe que este archivo debe ser utilizado como espacio swap. Debemos decirle al sistema que le dé formato swap al archivo y que luego lo habilite como tal.

Aunque antes de hacerlo, debemos ajustar los permisos en nuestro archivo de manera que no sea legible/modificable por nadie además del usuario root. Permitir que otros usuarios lean o escriban en este tipo de archivos sería un riesgo de seguridad enorme. Podemos bloquear estos permisos usando el siguiente comando:

sudo chmod 600 /swapfile

Verifique el archivo cambió a los permisos adecuados usando:

ls -lh /swapfile
-rw------- 1 root root 1.0G Aug 13 18:34 /swapfile

Tal como se observa, solo las columnas del usuario root tienen los privilegios de lectura y escritura activos. Para entender con más detalle el tema de los permisos y propiedades en Linux, visite nuestra guía.

Ahora que nuestro archivo es más seguro, podemos decirle a nuestro sistema que configure el espacio swap usando:

sudo mkswap /swapfile
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=45195790-e641-4a47-b0fa-ad9f4ccd6b0f

Nuestro archivo ya está listo para ser usado como espacio swap. Ahora podemos habilitarlo usando el comando:

sudo swapon /swapfile

Podemos comprobar si el procedimiento fue exitoso al revisar si nuestro sistema reporta un espacio swap:

sudo swapon -s
Filename     Type    Size       Used    Priority
/swapfile    file    1048572    0       -2

Aquí tenemos un nuevo espacio swap. Podemos usar la utilidad free una vez más para corroborar la información:

free -m
             total       used       free     shared    buffers     cached
Mem:           490        161        328          0         11         64
-/+ buffers/cache:         86        403
Swap:         1535         18       1517

Nuestro swap ha sido configurado con éxito y nuestro sistema operativo comenzará a usarlo cuando sea necesario.

Hacer que nuestro archivo Swap sea permanente

Ya tenemos nuestro archivo swap habilitado, pero si reiniciamos, el servidor no activará el archivo automáticamente. Podemos cambiar esto modificando el archivo fstab.

Edite el archivo con privilegios root, usando su editor de texto favorito:

sudo nano /etc/fstab

Al final del archivo, debe agregar una línea que le diga al sistema operativo que use el archivo que usted creó automáticamente:

/swapfile   none    swap    sw    0   0

Salga y guarde el archivo cuando haya terminado.

Ajuste su configuración de Swap

Hay una gran variedad de opciones que puede configurar y que tienen un impacto en el desempeño de su sistema al lidiar con swap.

El parámetro swapiness configura qué tan a menudo su sistema intercambia datos sacándolos de la memoria RAM y situándolos en el espacio swap. Esto es un valor que representa porcentaje y se fija entre 0 y 100.

Cuando los valores son cercanos a cero, el kernel no hará intercambios de datos en el disco a menos que sea absolutamente necesario. Recuerde, las interacciones con el archivo swap son "costosas" desde la perspectiva que toman mucho más tiempo que las interacciones con la memoria RAM y que pueden causar una reducción significativa en el desempeño. Decirle al sistema que no se fíe demasiado en swap, hará que su sistema sea más rápido en la mayoría de los casos.

Si el valor está más cerca de 100, entonces el sistema intentará poner más datos en el espacio swap en un esfuerzo de mantener la memoria RAM libre. Dependiendo del perfil de memoria de sus aplicaciones o del uso que le da al servidor, esta opción podría ser mejor en algunos casos (mucho menos comunes).

Podemos ver nuestro swapiness actual usando el siguiente comando:

cat /proc/sys/vm/swappiness
60

Para un computador de escritorio, una configuración de swappiness de 60 no está mal. Pero para un VPS, probablemente querremos moverlo más cerca del valor 0.

Podemos configurar el swapiness a un valor distinto, utilizando el comando sysctl.

Por ejemplo, para configurar un swappiness de 10, podemos ejecutar:

sudo sysctl vm.swappiness=10
vm.swappiness = 10

La configuración se mantendrá hasta el siguiente reinicio del sistema. Para que este valor sea automático incluso después de un reinicio, debemos agregar una línea al archivo /etc/sysctl.conf:

sudo nano /etc/sysctl.conf

Al final del archivo, agregue:

vm.swappiness=10

Salga y guarde el archivo cuando haya terminado.

Otro valor relacionado que usted podría modificar es el vfs_cache_pressure. Esta opción indica hasta qué punto el sistema seleccionará información de inode y dentry caché por encima de otro tipo de datos.

Básicamente, estos son datos de acceso sobre su filesystem. En general, esto es bastante costoso de buscar y solicitado muy frecuentemente, por lo cual es excelente que su sistema almacene caché. Puede ver el valor actual consultando el filesystem proc una vez más:

cat /proc/sys/vm/vfs_cache_pressure
100

Tal como está configurado, nuestro sistema elimina la información inode de nuestro caché demasiado rápido. Podemos establecer un valor más conservador de 50 escribiendo:

sudo sysctl vm.vfs_cache_pressure=50
vm.vfs_cache_pressure = 50

Este valor también será válido solo durante la sesión activa del servidor. Podemos agregar una línea en nuestro archivo de configuración como lo hicimos para la opción swappiness:

sudo nano /etc/sysctl.conf

Al final, añada la línea que especifica su nuevo valor:

vm.vfs_cache_pressure = 50

Guarde y cierre el archivo cuando haya terminado.

Conclusión

Seguir los pasos en esta guía le dará un respiro en términos de uso de su memoria RAM. El espacio Swap es muy útil para evitar algunos problemas comunes.

Si está teniendo errores OOM por falta de memoria (out of memory, por sus siglas en inglés), o si encuentra que su sistema no es capaz de utilizar aplicaciones que usted necesita, la mejor solución es optimizar las configuraciones de su aplicación o actualizar su servidor. Sin embargo, la configuración del espacio swap, le puede dar más flexibilidad y puede ayudarle a obtener más tiempo a cambio de un servidor menos poderoso.

Recursos adicionales

Tal como fue reiterado a lo largo de nuestro tutorial, el espacio swap estará estrechamente relacionado con el uso de su servidor. Puede consultar los siguientes recursos en busca de información adicional con respecto a este tema. Aunque este material es provisto esperando que sea útil, tome en cuenta que no podemos dar fe de la actualidad o precisión de los contenidos externos.

  • Artículo que explica el concepto de swap en Linux (Linux Foundation).
  • Siempre recuerde que los comandos mencionados tienen su propia información de ayuda si son ejecutados con la opción --help o -h. En consecuencia, use los siguientes comandos para mostrar información sobre el uso y/o función de las utilidades usadas en este tutorial:
    swapon --help
    dd --help
    fallocate --help
    mkswap --help
    

¿QUÉ DESEAS SABER?

Intentaremos leer tu mente...