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