Gestión de memoria de intercambio (swap) en GNU/Linux.

Autor: Joel Barrios Dueñas
Correo electrónico: darkshram en gmail punto com
Sitio de Red: http://www.alcancelibre.org/
Jabber ID: darkshram@jabber.org

Creative Commons Reconocimiento-NoComercial-CompartirIgual 2.1

© 1999-2016 Joel Barrios Dueñas. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales (incluyendo su publicación, a través de cualquier medio, por entidades con fines de lucro). c) Si altera o transforma esta obra o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector, hace mal uso de éstos.

Introducción.

¿Qué es y como funciona el espacio de intercambio?

El espacio de memoria de intercambio o Swap es lo que se conoce como memoria virtual. La diferencia entre la memoria real y la virtual es que está última utiliza espacio en la unidad de almacenamiento en lugar de un módulo de memoria. Cuando la memoria real se agota, el sistema copia parte del contenido de esta directamente en este espacio de memoria de intercambio a fin de poder realizar otras tareas.

Utilizar memoria virtual tiene como ventaja el proporcionar la memoria adicional necesaria cuando la memoria real se ha agotado y se tiene que continuar un proceso. Como consecuencia de utilizar espacio en la unidad de almacenamiento como memoria es que es considerablemente más lenta.

¿Cuánto espacio para memoria de intercambio se debe asignar al sistema?

Menos de 1 GB RAMDoble de la cantidad total de memoria RAM.
Más de 1 GB RAMMisma cantidad del total de memoria RAM, más 2 GB.

Independientemente de la cantidad de memoria RAM disponible, el sistema podrá trabajar normalmente con de 4 a 8 GB de memoria de intercambio, salvo que una aplicación o programa en particular lo requiera. Los programas de instalación de la mayoría de las distribuciones asignan hasta 4 GB si se realiza una instalación predeterminada sin personalizar aún en sistemas con mucha memoria RAM.

¿Cuándo se requiere aumentar la cantidad de memoria de intercambio?

Considere incrementar la cantidad de memoria de intercambio en los siguientes casos:

Procedimientos para aumentar la cantidad de memoria de intercambio.

Cambiar el tamaño de la partición.

Cambiar el tamaño de las particiones es un método efectivo si hay espacio disponible sin particionar. Sin embargo, representa un riesgo debido a la posibilidad de errores durante el proceso que podría tener como consecuencia la pérdida de datos. Este método requiere disponer de un respaldo de todos los datos importantes antes de comenzar.

Puede utilizar parted o gparted desde un disco vivo.

La mejor solución para un sistema que se está quedando sin memoria disponible siempre será adquirir más RAM.

Activar una partición de intercambio adicional.

La sintaxis para dar formato a una partición como memoria de intercambio es mkswap con la opción -f para forzar el procedimiento de formato, la opción -c para buscar, marcar y evitar sectores dañados y el nombre del dispositivo como argumento:

mkswap -f -c [dispositivo]

Asumiendo que dispone de una partición sin utilizar denominada /dev/sdb12, lo siguiente dará formato como memoria de intercambio a la partición /dev/sdb12, forzando el procedimiento y verificando sectores en busca de bloques dañados:

mkswap -f -c /dev/sdb12

Lo anterior puede devolver una salida similar a la siguiente:

Setting up swapspace version 1, size=1048576 bytes
no label, UUID=d2fea5ab-c677-8047-789a-e54ae19c506b

Para activar la partición y que sea utilizada inmediatamente por el sistema operativo, se ejecuta swapon con el nombre de la partición como argumento:

swapon [dispositivo]

En el siguiente ejemplo se activa como partición de memoria de intercambio a la partición /dev/sdb12:

swapon /dev/sdb12

Ejecute free para corroborar que nuevo archivo de memoria de intercambio está siendo utilizada por el sistema operativo. La salida puede ser similar a la siguiente:

             total       used       free     shared    buffers     cached
Mem:        321364     312576       8788          0        940      63428
-/+ buffers/cache:     248208      73156
Swap:      1426416           0   1426416

Para que esta partición se utilice como memoria de intercambio automáticamente en el siguiente arranque del sistema, se edita el archivo /etc/fstab:

vim /etc/fstab

La línea que se deba agregar lleva el siguiente formato:

[partición]		swap	swap	defaults	0 0

En el siguiente ejemplo se definirá como partición de memoria de intercambio a la partición /dev/sdb12:

/dev/sdb12		swap	swap	defaults	0 0

Asignar más espacio a un volumen lógico.

Por lo general un buen administrador siempre dejará espacio sin utilizar en un grupo de volumen. Una ventaja de utilizar volúmenes lógicos consiste en que se pueden agrandar con el sistema en funcionamiento y prescindir de realizar el proceso desde un disco vivo. El siguiente escenario asume que así es y que el volumen lógico utilizado como memoria de intercambio corresponde a /dev/mapper/lv_swap.

Desactive la partición de memoria de de intercambio:

swapoff /dev/mapper/lv_swap

Ejecute lvextend con la opción -l usando como argumentos +100%FREE y el nombre del dispositivo del volumen lógico para hacer que este volumen crezca utilizando el 100% de las extensiones sin utilizar en el grupo de volumen.

lvextend -l +100%FREE /dev/mapper/lv_swap

Active de nuevo la partición de memoria de de intercambio:

swapoff /dev/mapper/lv_swap

Utilizar un archivo como memoria de intercambio.

Este método es idóneo para usuarios poco experimentados. El archivo de memoria de intercambio puede estar en cualquier ruta del sistema de archivos.

Ejecute dd con if=/dev/zero, of=/swap) y bs=1024 y count=512000. Para crear un archivo con ceros, denominado /swap y 524288000 bytes (512 MiB):

dd if=/dev/zero of=/swap bs=1024 count=512000

La salida será similar a la siguiente:

512000+0 registros leídos
512000+0 registros escritos
524288000 bytes (524 MB) copiados, 6.99465 s, 75.0 MB/s

Ejecute mkswap con la opción -f para forzar el procedimiento de formato, la opción -c la verificación de sectores y /swap como argumento para dar formato a este mismo archivo:

mkswap -f -c /swap

La salida será similar a la siguiente:

Setting up swapspace version 1, size = 511996 KiB
no label, UUID=fed2aba5-77c6-4780-9a78-4ae5e19c506b

Para activar la partición y que sea utilizada inmediatamente por el sistema operativo, se ejecuta swapon. En el siguiente ejemplo se activa como partición de memoria de intercambio a el archivo /swap:

swapon /swap

Ejecute free para corroborar que que hay 512 MiB adicionales de memoria de intercambio. La salida puede ser similar a la siguiente:

             total       used       free     shared    buffers     cached
Mem:        321364     312576       8788          0        940      63428
-/+ buffers/cache:     248208      73156
Swap:      3145724          0    3145724

O bien ejecute swapon con la opción -s:

swapon -s

Lo anterior debe devolver una salida similar a la siguiente:

Filename				Type		Size	Used	Priority
/dev/dm-2                              	partition	6336508	44	-1
/swap                                  	file	511996	0	20

Para hacer el sistema utilice permanentemente este archivo como memoria de intercambio, edite el archivo /etc/fstab:

vim /etc/fstab

Añada el siguiente contenido:

/swap		swap	swap	defaults	0 0

Optimización del uso de memoria de intercambio.

Opción vm.swappiness.

El núcleo de Linux permite cambiar con que frecuencia las aplicaciones y programas son movidas de la memoria física hacia la memoria de intercambio a través de un valor que define el peso relativo de uso de está última. Ésto se controla a través del parámetro vm.swappiness. El valor predeterminado de éste es 60. Un valor 0 desactiva por completo el uso de memoria de intercambio. Un valor 100 haría que el sistema utilice memoria de intercambio de manera agresiva.

Ejecute lo siguiente para corroborar el valor predeterminado:

cat /proc/sys/vm/swappiness

O bien ejecute lo siguiente:

sysctl vm.swappiness

El valor predeterminado fue establecido por los desarrolladores del núcleo de Linux con la finalidad de permitir realizar pruebas y diagnósticos. Es un valor muy elevado para la mayoría de los usos que se le puede dar al sistema operativo. Conviene cambiar este valor por uno más bajo a fin de que el sistema utilice menos la memoria de intercambio y se prefiera reclamar en cambio la memoria cache. Ésta es una clase de memoria RAM estática de acceso aleatorio (SRAM o Static Random Access Memory). Se sitúa entre la Unidad Central de Procesamiento (CPU) y la memoria RAM y se presenta de forma temporal y automática para el usuario proporcionado acceso rápido a los datos de uso más frecuente.

En sistemas de escritorio escritorios se recomienda utilizar un valor entre 10 y 20. Un valor entre 20 y 60 puede mejorar el rendimiento de servidores en general.

En el siguiente ejemplo se aplica el valor 10 para el archivo /proc/sys/vm/swappiness.

echo 10 > /proc/sys/vm/swappiness

Ejecute sysctl con la opción -w y vm.swappiness=10 como argumento parea hacer lo mismo:

sysctl -w vm.swappiness=10

Lo anterior devuelve una salida similar a la siguiente y que confirma se ha aplicado el cambio:

vm.swappiness = 10

Este cambio en las variables del sistema de forma aplica inmediata hasta el siguiente reinicio del sistema. Para hacer que el cambio sea permanente edite el archivo /etc/sysctl.conf.

vi /etc/sysctl.conf

Añada la siguiente línea al final del archivo:

vm.swappiness = 10

Lo anterior se puede complementar a través de la opción vm.vfs_cache_pressure, la cual permitirá liberar parte de la memoria cache. Ésta controla la tendencia con la que el núcleo reclama la memoria utilizada para el cache de directorios e inodos de objetos. Su valor predeterminado es 100 y especifica se intente reclamar las estradas de directorios (dentries) e inodos a una tasa más o menos justa con respecto del reclamo de paginación de memoria cache y la paginación de memoria de intercambio. Disminuir el valor ocasiona que el núcleo prefiera retener las entradas de directorios e inodos en el cache. Incrementar el valor ocasiona que el núcleo prefiera reclamar la memoria utilizada por las entradas de directorios e inodos.

El siguiente ejemplo establece un valor igual a 1000 para vm.vfs_cache_pressure:

sysctl -w vm.vfs_cache_pressure=1000

Para hacer que el cambio sea permanente edite el archivo /etc/sysctl.conf.

vi /etc/sysctl.conf

Añada la siguiente línea al final del archivo:

vm.vfs_cache_pressure = 1000

Asignación de prioridad de memoria de intercambio.

Es posible dar mayor o menos prioridad de uso a los diversos archivos o dispositivos para memoria de intercambio a fin de favorecer aquellos alojados en medios de almacenamiento más rápidos —como unidades SDD tipo SDRAM o bien dispositivos creados con zram. El valor de la prioridad puede ser cualquier número entero entre 0 y 65535. Mientras más alto sea el número, más alta será la prioridad.

Desactive el archivo /swap ejecutando lo siguiente:

swapoff /swap

Active de nuevo con swapon con la opción -p, el número de prioridad deseada entre 0 y 65535 y /swap como argumento. Ejemplo:

swapon -p 30 /swap

Ejecute swapon con la ocpión -s:

swapon -s

La salida será similar a la siguiente:

Filename				Type		Size	Used	Priority
/dev/dm-2                              	partition	6336508	44	-1
/swap                                  	file	511996	0	30

Para hacer permanente el cambio, edite el archivo /etc/fstab:

vi /etc/fstab

Añada pri=30 a la columna de opciones del archivo o dispositivo de memoria de intercambio. Ejemplo:

/swap		swap	swap	defaults,pri=30	0 0

Reinicie el sistema y haga nuevamente las comprobaciones ejecutando swapon con la opción -s.