Hoy he respondido a una duda sobre la cantidad de memoria swap adecuada para un equipo Linux.
¿Qué es la memoria Swap?
La memoria swap es una porción de memoria destinada a alojar las páginas de memoria que no caben en la memoria RAM de nuestro equipo. Además, el kernel puede «aparcar» en el swap trozos de memoria ram que se acceden poco frecuentemente a fin de disponer de más memoria RAM para otras aplicaciones que pudieran necesitarla.
La memoria swap normalmente de asigna reservando espacio del almacenamiento del ordenador, o sea, del disco duro del mismo. Para que te hagas una idea, la velocidad de acceso al disco duro comparada con la de la memoria ram es miles de veces más lenta. Por eso, cuando oímos que un ordenador swapea, sabremos que estará sudando la gota gorda utilizando el disco duro a modo de memoria RAM.
¿Es necesaria una particion para swap en Linux?
No, para nada. De hecho yo hace años que no pongo particiones en mis equipos, sobremesa o portátiles. Linux puede funcionar perfectamente sin memoria swap peeeeeeeeeeeeeeeeeeeeeeero
Si se da el caso de que necesites más memoria de la que tu ordenador tiene, entrará en funcionamiento un procedimiento denominado OOM (Out Of Memory) en el que el kernel evalúa y elige procesos para MATAR y de esta forma recuperar la memoria que estaban utilizando. Es decir, el kernel se va a buscar la manera de disponer de memoria, incluso a base de ejecutar (matar) procesos que se estén lanzados en ese momento.
Esto no quiere decir que sea necesario dedicar una partición del disco duro exclusivamente para swap. Si lo hacemos, estaremos hipotecando esos gigas para algo que puede que utilicemos muy rara vez o nunca. La mejor opción es crear archivos del tamaño que queramos e ir asignándolos a swap. Veremos esta opción más adelante en este mismo post.
¿Cuanta memoria swap necesito?
Hace muchos años, la regla de oro era asignar el doble de memoria swap de la RAM que tenía el equipo. Si tu equipo tenía 4 Mbytes de RAM, creabas una partición de swap de 8 Mbytes en el disco duro. Más adelante, cuando los equipos fueron teniendo más memoria y eran más dificil necesitar más RAM, la regla pasó a ser asignar la misma cantidad de memoria swap que la memoria RAM del equipo. Es decir, si el equipo tenía 1GB de RAM, asignabas 1GB de swap.
En la actualidad, cuando no es raro disponer de 8 gigas en un ordenador, no tiene mucho sentido reservar 8 GB de tu disco (muchas veces SSD) para memoria SWAP. Es algo desproporcionado y que seguramente jamás llegues a utilizar en su totalidad.
Mi recomendación, en función de la memoria del equipo sería:
- 2GB de RAM – 2GB de SWAP
- 4GB de RAM – 2GB de SWAP
- 8GB de RAM – 3GB de SWAP como mucho
- 16GB de RAM – 4 GB de SWAP como mucho
¿Partición SWAP o archivos SWAP?
Con la partición SWAP aseguras que siempre va a haber espacio destinado a SWAP. Sin embargo, si usas archivos swap puedes tener una cantidad mínima de swap y si ves que en un momento dado vas a necesitar más memoria, o ves procesos muertos por falta de memoria, asignar temporalmente más. Mi opción es siempre usar archivos por la flexibilidad que ofrece a la hora de trabajar, como veremos en el siguiente ejemplo:
Partimos de la base de un equipo (el mio de casa) con 16GB de RAM, en el que no tenemos swap:
root@casa:~# free -m total used free shared buffers cached Mem: 15982 3206 12776 18 89 2049 -/+ buffers/cache: 1067 14915 Swap: 0 0 0
Vamos a crear un archivo en el raíz del filesystem, de 1GB de tamaño. Para ello utilizaremos el comando dd, diciéndole que obtenga datos de /dev/zero (es decir, que va a llenar el archivo de ceros) y que los escriba en un archivo en el directorio raíz llamado /ficheroswap1G. Le diremos que obtenga los ceros del origen de 1024 bytes en 1024 bytes, por velocidad. Resulta más rápido leer un bloque de 1024 ceros que leer por separado un cero 1024 veces. Por último, el parámetro count dirá cuantos bloques de 1KB queremos. Como buscamos 1GB, habrá que poner 1000000 bloques de ceros, es decir, 1000 Megabytes, o 1 millon de KB.
root@casa:~# dd if=/dev/zero of=/ficheroswap1G bs=1024 count=1000000 1000000+0 records in 1000000+0 records out 1024000000 bytes (1,0 GB) copied, 2,21998 s, 461 MB/s
El swap necesita tener un identificador único, algo así como un formateo. Utilizaremos el comando mkswap para darle este formato al archivo que hemos creado.
root@casa:~# mkswap /ficheroswap1G Setting up swapspace version 1, size = 999996 KiB no label, UUID=78336c6f-cf21-47c8-a267-28fa64150d79
Con swapon, vamos a poner a funcionar este giga de swap que acabamos de crear
root@casa:~# swapon /ficheroswap1G
Como verás, ahora nuestro equipo dispone de 1 GB de memoria SWAP disponible. Sin reinicios, ni particionar, ni nada. En caliente.
root@casa:~# free -m total used free shared buffers cached Mem: 15982 3209 12772 18 90 2049 -/+ buffers/cache: 1070 14912 Swap: 976 0 976
Ahora vamos a suponer que estamos haciendo una tarea con gran demanda de memoria y hemos visto que por falta de memoria ram + memoria swap, nuestro proceso ha sido matado por el kernel. Vale, vamos a darle temporalmente más swap, en concreto otros 2 GB de memoria swap en fichero
root@casa:~# dd if=/dev/zero of=/ficheroswap2G bs=1024 count=2000000 2000000+0 records in 2000000+0 records out 2048000000 bytes (2,0 GB) copied, 3,72945 s, 549 MB/s
Le damos formato swap a este fichero…
root@casa:~# mkswap /ficheroswap2G Setting up swapspace version 1, size = 1999996 KiB no label, UUID=bae94e46-0ed7-418f-a560-238e75360a86
Y por último lo hacemos activo con swapon
root@casa:~# swapon /ficheroswap2G
Como puedes ver, ahora tenemos 3GB de swap disponibles.
root@casa:~# free -m total used free shared buffers cached Mem: 15982 5227 10754 18 91 4002 -/+ buffers/cache: 1133 14848 Swap: 2929 0 2929
Si quieres utilizar archivos para tu swap, deberás tener en cuenta que si reinicias, han de activarse, igual que las particiones. El archivo en el que especificamos que filesystems se montan en el arranque es /etc/fstab. Allí añadiremos líneas como las siguientes:
/ficheroswap1G none swap 0 0 /ficheroswap2G none swap 0 0
¿Influye tener swap en el rendimiento?
No. Un ordenador sin memoria swap no va a ir mejor ni peor que uno que si tenga swap. Sin embargo, sí se comportarán diferente a la hora de enfrentarse a una situación de escasez o agotamiento de memoria RAM disponible.
El equipo que disponga de memoria swap, comenzará a escribir a disco páginas de memoria, utilizándolas como una extensión de la memoria RAM disponible, y ralentizando al extremo el equipo en ese momento. La memoria RAM es capaz de transferir varios gigabytes por segundo de datos. Un disco duro swapeando será capáz en el mejor de los casos de transferir 130 Mbytes/segundo, y si es un SSD, alrededor de 500 Mbytes/segundo. Hay que añadir además, que el tiempo de acceso de la memoria ram se mide en nanosegundos (mil millonésimas de segundo) mientras que el tiempo de acceso de un disco duro suele ser de entre 6 y 14 milisegundos (milésimas de segundo) y el de un SSD puede variar entre 0.05 y 0.5 milisegundos, en ambos casos, hablamos de que swapear a disco duro o a SSD es miles de veces más lento que el uso de memoria RAM.
Por otra parte, el equipo que no tenga swap, simplemente sacará la pistola y comenzará a pegar tiros, a fin de disponer de memoria RAM. Es una solución brusca y muy agresiva, por lo que jamás queremos llegar a una situación de falta de memoria si no disponemos de swap en nuestro equipo, al menos si valoramos el trabajo que estemos haciendo en esos momentos.
Como resumen a este último apartado, un ordenador con swap podrá aguantar situaciones de falta de memoria con una penalización extrema de rendimiento, pero saliendo de esa situación si es transitoria. Un ordenador sin swap simplemente ejecutará procesos sin compasión con el fin de poder seguir disponiendo de ram.