Configuración de disco SWAP

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.

¿ 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: 0x00000000

Device 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): 82

Command (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: 0x00000000

Device 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
.....

4 thoughts on “Configuración de disco SWAP

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *