La memoria SWAP (también conocida como espacio de intercambio o memoria virtual) es una partición en nuestro disco duro que se utiliza para almacenar las imágenes de procesos y datos que no es posible almacenar en nuestra memoria física (RAM) por falta de espacio en la misma. Optimizar el uso que nuestro servidor hace de la SWAP es importante para el rendimiento de nuestro sistema, y aquí vamos a ver algunas características principales para hacer un buen uso de ella.
Como todos sabemos, según vamos ejecutando aplicaciones en nuestro servidor, estas van haciendo uso de la memoria RAM. Puede llegar un momento en que nuestra memoria física esté prácticamente llena y esto nos impida continuar ejecutando aplicaciones por falta de espacio en la misma. Aquí es cuando entra en juego la memoria SWAP. A partir de un cierto porcentaje de carga en nuestra RAM, nuestro sistema operativo buscará las imágenes de aquellos procesos que menos utilicemos y los moverá a la memoria SWAP, liberando así espacio de nuestra RAM para poder seguir cargando en ella otras aplicaciones. Esto resulta de gran ayuda, pero cuando hacemos un uso excesivo de la memoria SWAP, teniendo todavía disponible memoria RAM, notaremos cómo nuestro sistema se relentiza. Esto es debido a que la velocidad de consulta de la información que tenemos almacenada en nuestra memoria RAM es muy superior a la velocidad de consulta hacia nuestro disco duro, que es donde se almacena la SWAP.
¿Qué cantidad de SWAP es aconsejable asignar?
Aunque, como se suele decir coloquialmente, cada maestrillo tiene su librillo, normalmente se sigue la siguiente regla para la asignación de la SWAP:
Ajustar el uso de la memoria SWAP
En linux, el parámetro «swappiness» nos permite controlar en qué momento nuestro sistema operativo empezará a liberar la carga de la RAM enviado información a la SWAP. El valor de «swappiness» puede ir desde 0 (no se realizará ningún intercambio entre la RAM y la SWAP) hasta 100 (el intercambio se realizará constantemente). Por defecto, «swappines» tiene un valor de 60, que es apropiado para la mayoría de servidores, pero si tenemos un servidor con poca carga de procesamiento, es posible que deseemos reducir el uso de SWAP para aumentar la velocidad de procesado; si por el contrario, tenemos un servidor con alta carga de trabajo (bases de datos de gran tamaño, etc), es posible que deseemos aumentar el uso de SWAP para que la RAM pueda hacer frente a más trabajo.
El siguiente comando nos indicará qué valor tenemos configurado en el parámetro «swappiness»:
[root@srv ~]# cat /proc/sys/vm/swappiness 60
Si deseamos reducir el valor «Swappiness» de 60 a 10:
[root@srv ~]# sysctl -w vm.swappiness=10
Si deseamos aumentarlo, ejecutaremos el mismo comando indicando el valor que deseemos asignarle.
Para conseguir que este cambio sea permanente y se mantenga tras el siguiente reinicio del sistema, abriremos el archivo /etc/sysctl.conf
[root@srv ~]# nano /etc/sysctl.conf
Y editaremos (o añadiremos al final, en caso de que no exista), la siguiente línea con el valor que deseemos:
vm.swappiness=10
Podremos comprobar cómo, tras guardar los cambios, nuestro valor de intercambio se mantiene tras el reinicio del sistema.
¿Cómo saber qué procesos usan la SWAP?
Los comandos «top» y «free» nos ofrecen información acerca de la SWAP utilizada por nuestro servidor, de forma global. Si queremos obtener un listado que especifique cada proceso con su utilización de SWAP, podemos usar el siguiente comando:
[root@srv ~]# for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done
Como la salida de este comando puede ser extensa, con este otro comando podemos obtener el mismo listado paginado:
[root@srv ~]# for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 2 -n -r | less
¿Y si queremos saber únicamente la swap utilizada por un proceso en concreto? Lo primero que haremos será encontrar el ID del proceso, en nuestro ejemplo queremos saber el ID de Exim, y para ello ejecutamos lo siguiente:
[root@srv ~]# pidof exim 30733
Una vez obtenido el número de proceso, con el siguiente comando obtendremos la SWAP que está utilizando:
[root@srv ~]# grep VmSwap /proc/30733/status VmSwap: 0 kB
Liberando la memoria SWAP que está en uso
Si vemos que todavía tenemos espacio libre en nuestra memoria RAM y nuestra SWAP está siendo utilizada, es posible que queramos vaciar la SWAP y traspasar su contenido a la RAM. Siempre teniendo en cuenta que en la RAM debe quedar espacio suficiente para albergar el espacio que deseamos traspasar desde nuestra SWAP, por supuesto. Podemos vaciar la SWAP con el siguiente comando:
[root@srv ~]# swapoff -a ; sudo swapon -a
Este comando puede tardar un poco en finalizar, todo dependerá del tamaño de los datos que tuviésemos almacenados en nuestra SWAP.
Ahora ya sabemos qué es la SWAP y cómo gestionarla correctamente para optimizar los recursos de nuestro servidor.