Algunos servidores privados virtuales (Virtual Private Server o VPS) no tienen un disco de intercambio o swap. Éstos son muy útiles cuando nuestro servidor se queda sin memoria RAM y no puede continuar trabajando (o nos da fallos como al final de esta página). Pero debemos ser cuidadosos, un disco swap puede ser útil en picos de uso del servidor, éste empezará a utilizar el disco duro como si fuera memoria RAM y empezará a consumir más CPU mientras mueve contenidos de disco a RAM y de RAM a disco, por lo que no podemos estar siempre tirando de memoria de intercambio.
Encontramos dos tipos de servidores
- Aquellos que nos dejan crear unidades o particiones virtuales en nuestro espacio, por lo que podemos crear una para almacenar la unidad de intercambio. (Por ejemplo Amazon EC2).
- En cambio otros, no nos dejan crear unidades virtuales en nuestro hosting, por lo que tendremos que crear un fichero de intercambio en nuestra partición principal para poder beneficiarnos de esta característica. (DigitalOcean).
Para esta guía estoy usando un servidor Ubuntu 12.04 x64.
Contents
¿ Cuánto espacio reservo para swap ?
No hay una receta mágica que nos diga cuánto espacio debemos reservar en un servidor (ya sea en disco o en archivo). Lo tenemos que basar en la experiencia y en el uso del servidor. Si tenemos un servidor de 4Gb de RAM, podemos empezar reservando 1 ó 2Gb. Si, tras unos días de uso, todo va bien, lo dejamos así. Si parece que no es suficiente, podemos probar a subirlo, aunque tal vez sea el momento de pensar si necesitamos ampliar la RAM. Debemos entonces, basar la decisión en el uso medio del servidor y el coste (nuestro peor enemigo); si nuestro espacio de intercambio no fuese suficiente en un pico aislado de uso o si no es suficiente a menudo.
Creando un fichero de intercambio
Lo primero de todo es asegurarnos de que tenemos suficiente espacio en nuestro servidor. Vamos a crear un archivo de intercambio de 2Gb en nuestro servidor. Y lo vamos a alojar en /var/swap, por tanto escribimos:
$ sudo dd if=/dev/zero of=/var/swap bs=2048 count=1024k
1048576+0 records in
1048576+0 records out
2147483648 bytes (2.1 GB) copied, 8.07862 s, 266 MB/s
Una vez lo hayamos creado, debemos configurar este espacio, ahora mismo tenemos un fichero vacío:
$ sudo mkswap /var/swap
Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=03bb7eb2-dcd7-40b6-bcf5-309836d448cc
¡ Vamos a activar nuestro archivo de intercambio !
$ sudo swapon /var/swap
Creando el espacio swap en un disco virtual
Primero, debemos crear un nuevo disco virtual, podemos hacerlo en el panel de control de nuestro proveedor, así que, supondremos que ya está creado y se encuentra en /dev/xvdb3. Entonces, debemos asegurarnos de que es un espacio swap (esto podemos hacerlo en algunos paneles de control directamente), por tanto, escribimos:
$ sudo fdisk -l /dev/xvdb
Disk /dev/xvdb: 97642 MB, xxxxxxx bytes
255 heads, 63 sectors/track, xxxx cylinders
Units = cylinders of 16065 * 512 = xxxx bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000Device Boot Start End Blocks Id System
/dev/xvdb1 x xx xxxxxxx+ 83 Linux
/dev/xvdb2 xx xxxx xxxxxxxx 83 Linux
/dev/xvdb3 xxxx xxxxx xxxxxxxxxx 83 Linux
Nuestra partición /dev/xvdb3 no es un espacio swap pero la podemos convertir ejecutando (el texto interactivo está en negrita):
$sudo fdisk /dev/xvdb3
Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): 82Command (m for help): p
Disk /dev/xvdb: 97642 MB, xxxxxxx bytes
255 heads, 63 sectors/track, xxxx cylinders
Units = cylinders of 16065 * 512 = xxxx bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000Device Boot Start End Blocks Id System
/dev/xvdb1 x xx xxxxxxx+ 83 Linux
/dev/xvdb2 xx xxxx xxxxxxxx 83 Linux
/dev/xvdb3 xxxx xxxxx xxxxxxxxxx 83 Linux swap / Solaris
Command (m for help): w
Ahora que tenemos nuestro disco swap, lo configuramos y lo activamos:
$ mkswap /dev/xvdb3
Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=03bb7eb2-dcd7-40b6-bcf5-309836d448cc
$ swapon /dev/xvdb3
Haciendo los cambios permanentes
Para que nuestro sistema active el espacio de intercambio durante el arranque (a veces, los servidores necesitan reiniciarse), debemos añadir una nueva línea al archivo /etc/fstab:
/dev/xvdb3 none swap sw 0 0
en caso de una partición de intercambio, o:
/var/swap none swap sw 0 0
en caso de un fichero de intercambio.
Comprobando que nuestro sistema utiliza el espacio de intercambio
Para comprobar nuestro espacio de intercambio escribimos (probado en un servidor con 512Mb de RAM):
$ free
total used free shared buffers cached Mem: 503252 495444 7808 0 3108 394036 -/+ buffers/cache: 98300 404952 Swap: 2097148 0 2097148
o:
$ swapon -s
Filename Type Size Used Priority /var/swap file 2097148 0 -1
Hemos activado con éxito nuestro nuevo espacio de intercambio. Ahora debemos ver con menos (o ninguna) frecuencia los Out of memory (OOM) kills (terminaciones forzosas de las aplicaciones por excesivo consumo de memoria) en nuestro dmesg, así como me pasaba a mi en momentos de uso intensivo del servidor, imposibilitando el acceso a algunos usuarios a mi web:
$ dmesg
[557354.896599] Out of memory: Kill process 25496 (apache2) score 21 or sacrifice child [557354.897487] Killed process 25496 (apache2) total-vm:440892kB, anon-rss:55964kB, file-rss:3872kB [557362.773956] apache2 invoked oom-killer: gfp_mask=0x200da, order=0, oom_adj=0, oom_score_adj=0 [557362.773962] apache2 cpuset=/ mems_allowed=0 [557362.773967] Pid: 25398, comm: apache2 Not tainted 3.2.0-23-virtual #36-Ubuntu [557362.773970] Call Trace: [557362.773982] [] ? cpuset_print_task_mems_allowed+0x9d/0xb0 [557362.773990] [] dump_header+0x91/0xe0 [557362.773995] [] oom_kill_process+0x85/0xb0 [557362.773998] [] out_of_memory+0xfa/0x220 [557362.774003] [] __alloc_pages_nodemask+0x7ea/0x800 [557362.774010] [] alloc_pages_vma+0x9a/0x150 .....
Gracias por la explicación. Me ha funcionado perfecto en mi vps.
Gracias por tu comentario !
Muchas gracias… ha sido de gran utilidad
Muchas gracias