Hace ya un tiempo expliqué cómo utilizar un archivo como swap en FreeBSD. Esta vez me tocó implementar la misma solución sobre un servidor virtual (un Droplet, en la jerga de un conocido proveedor cloud) que vino "de fábrica" sin swap (memoria de intercambio).



Tal como expliqué en el mencionado artículo, es posible darse cuenta que el sistema no tiene swap observando la salida de top o free:

root@cloud:~# free -m
             total       used       free     shared    buffers     cached
Mem:          1003        882        120          0         69        602
-/+ buffers/cache:        210        792
Swap:            0          0          0

Sino directamente ejecutando swapon -s, el cual muestra el uso de swap por dispositivo:

root@cloud:~# swapon -s
Filename                                Type            Size    Used    Priority

Evidentemente el kernel Linux en este Debian Wheezy no estaba utilizando swap. El riesgo de no utilizar swap, es que si el sistema se queda sin memoria principal (RAM), no podrá iniciar nuevos procesos, o en el peor de los casos tendrá que matar procesos existentes (los clásicos OOM).

El sistema en cuestión tenía un único filesystem:

root@cloud:~# df -h
Filesystem                 Size  Used Avail Use% Mounted on
rootfs                      30G  4.1G   25G  15% /
udev                        10M     0   10M   0% /dev
tmpfs                      101M  148K  101M   1% /run
/dev/disk/by-label/DOROOT   30G  4.1G   25G  15% /
tmpfs                      5.0M     0  5.0M   0% /run/lock
tmpfs                      201M     0  201M   0% /run/shm

Como necesitaba resolver el problema rápidamente, quise evitar a toda costa redimensionar el filesystem raíz y reparticionar el disco. Entonces decidí utilizar un archivo como swap.

Manos a la obra

El primer paso consiste en crear un archivo de tamaño suficiente para que funcione como swap. El tamaño de la swap depende de cada instalación y de las necesidades del sistema. En este caso decidí utilizar una swap de 1 GB.

Es posible utilizar la herramienta dd para crear el archivo relleno con ceros (su contenido no importa):

root@cloud:~# dd if=/dev/zero of=/var/swap bs=4096k count=256
256+0 records in
256+0 records out
1073741824 bytes (1.1 GB) copied, 3.74794 s, 286 MB/s

El archivo que funciona como swap queda almacenado en /var/swap.

root@cloud:~# ls -lth /var/swap 
-rw-r--r-- 1 root root 1.0G Feb 23 16:17 /var/swap

Luego se debe ejecutar el comando mkswap para crear el área de intercambio para Linux (similar a lo que se hace cuando se da formato a un filesystem cualquiera):

root@cloud:~# mkswap /var/swap 
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=a561df03-d00c-4b6b-8306-f36e0f155f1b

Luego se utiliza el comando swapon para activar la swap:

root@cloud:~# swapon /var/swap 

Inmediatamente se observa que el área de intercambio está disponible para su uso:

root@cloud:~# free -m
             total       used       free     shared    buffers     cached
Mem:          1003        934         68          0         61        704
-/+ buffers/cache:        167        835
Swap:         1023          0       1023

Si se desea que la swap se active automáticamente al iniciar el sistema, se debe agregar la siguiente línea al final del archivo /etc/fstab:

/var/swap                 none  swap sw                                       0  0

Es imprescindible que esta línea quede debajo de la línea correspondiente al sistema de archivos donde está alojado el archivo que funciona como swap, pues es necesario que el kernel Linux monte dicho filesystem antes de intentar iniciar la swap.

Al hacer este cambio en el archivo /etc/fstab es posible activar la swap simplemente ejecutando mount -a (en vez de swapon /var/swap).

Si se desea desactivar la swap, es posible ejecutar swapoff /var/swap en cualquier momento.

Para mostrar estadísticas de uso de la swap se puede recurrir tanto al comando free como a swapon -s:

root@cloud:~# swapon -s
Filename                                Type            Size    Used    Priority
/var/swap                               file            1048572 0       -1

Para más información:

man free
man mkswap
man dd
man swapon
man swapoff
man top
man df
man fstab


Tal vez pueda interesarte


Compartí este artículo