# rm-rf.es | Administración de sistemas

Bitácora personal de un SysAdmin Gnu/Linux, Windows, BSD...

Optimizar el uso de memoria RAM y Swap en Linux (Swappiness)


En el Kernel Linux, existe la posibilidad de configurar la proporción/relación de uso que se va a dar a la memoria RAM y a la memoria Swap en nuestro sistema.

Como la mayoría sabéis la memoria Swap, también conocida como memoria o espacio de intercambio es simplemente una partición asignada en un disco duro (del tamaño que estimemos necesario) cuya función es actuar como si de memoria RAM se tratase en el momento que hay poca memoria RAM disponible en el sistema.

Existe una gran penalización cuando usamos Swap en vez de RAM, ya que utilizamos el disco para el volcado de los datos que normalmente tendrían que ir en memoria física (RAM), esto provoca la ralentización general del sistema operativo, por lo que normalmente hay que intentar usar la menor cantidad de memoria Swap posible.

El objetivo de este artículo no es explicar las ventajas/desventajas de cada una de las memorias, sino saber cómo decirle a nuestro sistema operativo, y en concreto al Kernel Linux que porcentaje/ratio de memoria RAM usada es el límite para comenzar a utilizar swap.

Existe un parámetro a nivel de kernel, swappiness al que podemos asignarle un valor, de 0 a 100, que indicará la preferencia de la memoria Swap respecto a la RAM, la tendencia del sistema a mover procesos a disco en lugar de a memoria física.

Un valor de swappiness alto provocará que el kernel tenga tendencia a utilizar más memoria Swap, mientras que cuanto más bajo sea, mayor preferencia tendrá la memoria RAM. Por defecto creo recordar que el valor de swappiness es de 60:

$ cat /proc/sys/vm/swappiness
60

Para modificarlo a tiempo real, hacemos uso de sysctl del siguiente modo (como root):

sysctl vm.swappiness=30

Hay que tener en cuenta que de este modo perderemos el cambio tras un reinicio, para modificarlo de forma permanente editamos el fichero /etc/sysctl.conf

vim /etc/sysctl.conf

Y añadimos/modificamos:

vm.swappiness=30

Conviene probar diferentes valores hasta dar con el correcto, pues cada sistema puede tener unos requerimientos especiales, es interesante probar a tiempo real y controlar el rendimiento del sistema hasta dar con el valor óptimo para nuestros sistemas.

El comando Free


El comando Free en Linux muestra la cantidad de memoria libre y usada que tiene el sistema. Por una parte muestra la memoria física y por otra la swap, también muestra la memoria caché y de buffer consumida por el Kernel.

No es necesario pasarle ningún parámetro al comando para ver su funcionalidad:

$ free
             total       used       free     shared    buffers     cached
Mem:        514796     503800      10996          0       9208     184804
-/+ buffers/cache:     309788     205008
Swap:      1510036      38252    1471784

No obstante, puede ser personalizado con los siguientes parámetros:

-b, –bytes
Muestra la salida en bytes.
-k, –kb
Muestra la salida en kilobytes (KB). Es el resultado por defecto.
-m, –mb
Muestra la salida en megabytes (MB).
-g, –gb
Muestra la salida en gigabytes (GB).
-l, –lowhigh
Muestra información detallada acerca de la utilización baja y alta de memoria.
-o, –old
Muestra el formato antiguo, sin -/+ buffers/cache.
-t, –total
Muestra un resumen del total de memoria física y swap.
-c n, –count=n
Refrescará la información n veces y luego saldrá del programa.
-s n, –repeat=n
Repetición, pausando n segundos entre una y otra
-V, –version
Muestra la versión de free y sale.
–help
Muestra la ayuda y sale.

Cómo crear espacio TMP y SWAP en un servidor con las particiones ya creadas


Puede darse el caso, de que necesitemos añadir más swap a un servidor en producción, o recrear la partición temporal (tmp). Para estos casos, lo más sencillo es seguir los siguientes pasos, pues evitas cualquier tipo de reparticionamiento del sistema.

Básicamente, lo que vamos a hacer es crear un sistema de ficheros utilizando espacio del disco duro:

Añadir partición SWAP al sistema en producción:

Creamos un “fichero” de 1Gb, el cual posteriormente usaremos para crear una partición Swap:

dd if=/dev/zero of=/.swap bs=1024 count=1000000

Hacemos de ese fichero un sistema de ficheros swap:

mkswap /.swap

Y activamos el espacio Swap:

swapon /.swap

Si lanzamos un “free” o “top” veremos que ya tenemos el espacio swap funcionando. Por último hay que añadirlo al fichero /etc/fstab para que al reiniciar se monte automáticamente:

/.swap swap swap defaults 0 0

Añadir partición TMP al sistema en producción:

Creamos el fichero de 250 Mb para /tmp:

dd if=/dev/zero of=/.tmpfs bs=1024 count=250000

Hacemos de ese fichero un sistema de ficheros ext3:

mkfs -t ext3 /.tmpfs

Lo montamos, pasandole los parámetros noexec,nosuid para dotar a la partición de mayor seguridad:

mount -o loop,noexec,nosuid,rw /.tmpfs /tmp

Asignamos permisos:

chmod 0777 /tmp
chmod +t /tmp

Finalmente solo queda añadirlo también al fichero /etc/fstab para que se monte automáticamente al reiniciar:

/.tmpfs /tmp ext3 loop,rw,nosuid,noexec 0 0

Recalcar que esta no es la mejor solución, pero lamentablemente en servidores en producción es la más viable porque recrear la tabla de particiones puede ser un engorro en un servidor en producción.

Este artículo está basado la entrada en inglés de uno-code.com