HOWTO - Cómo mejorar el uso de memoria RAM y la partición SWAP mediante el valor de SWAPPINESS.

ÍNDICE


INTRODUCCIÓN

Este documento pretende explicar de manera general lo que es la memoria RAM, la memoria virtual, la partición swap, y el parámetro swappiness. Dichas explicaciones sirven de base para mostrar cómo modificar el valor del parámetro swappiness para un obtener un mejor desempeño del sistema.


MEMORIA RAM

Los equipos de cómputo usan la memoria RAM para poder abrir/ejecutar aplicaciones y documentos que están guardados en los medios de almacenamiento, como pueden ser discos duros, cintas, memorias USB, diskettes, etc. Mientras más memoria RAM tenga un equipo más tareas podrá ejecutar al mismo tiempo. La unidad de medida para la memoria RAM es el Byte (KiloBytes, MegaBytes, GigaBytes ...). Cuando el equipo se apaga todos los datos (programas y documentos) que contenía la memoria RAM se pierden de manera permanente, por ello es que si repentinamente se pierde energía eléctrica y no hay un UPS (Uninterruptible Power Supply) todos los documentos que se estaban redactando se pierden, a menos que se hayan guardado previamente en un medio de almacenamiento.


MEMORIA VIRTUAL, PAGINACION

Si la carga de trabajo llega a ser tal que la memoria RAM es insuficiente entonces el sistema operativo usa una área determinada de manera previa en el disco duro y empieza a usarla como si fuera memoria adicional. Dicha área tiene distintos términos dependiendo de sus características, por ejemplo: memoria virtual, intercambio, partición de intercambio, paginación, archivo de paginación, swap, swap partition, swapfile. La unidad de medida también es el Byte (KiloBytes, MegaBytes, GigaBytes ...).

MS Windows

Los sistemas MS Windows usan un archivo de paginación llamado pagefile.sys el cual es de sistema y se encuentra oculto en la raíz de la unidad C:, aunque dicha ubicación puede ser modificada. El tamaño del archivo de paginación también puede ser modificado. Un inconveniente es que el archivo de paginación está dentro del sistema de archivos principal, por lo tanto con el correr del tiempo el archivo de paginación estará fragmentado, y su tamaño puede llegar a ser tan grande que, de no haber espacio libre suficiente, no podrá ser defragmentado.

Kubuntu

Kubuntu (y muchos otros sistemas operativos libres) no hace uso de un archivo de paginación (aunque es posible hacerlo), sino que de manera típica el sistema usa una partición independiente de la partición raíz (/). Esa partición independiente es de tipo swap (significa intercambio, porque el sistema la usará para intercambiar datos con la memoria RAM) y cumple con el objetivo de servir como memoria virtual adicional.

La gran ventaja que tiene este tipo de memoria virtual, en comparación de MS Windows, es que la memoria virtual no interfiere con los distintos sistemas de archivos (/, /home, otros ...). Otra ventaja es que no afecta que ocurra fragmentación en la partición swap pues nunca habrán datos almacenados ahí de manera permanente.


PARTICIÓN SWAP

El tamaño de la partición swap se define durante la instalación del sistema, aunque posteriormente puede ser modificado su tamaño, o pueden crearse archivos especiales que funcionen como una adición a la partición swap. Muchos sistemas modernos tienen tal cantidad de memoria RAM que aparentemente el uso de la partición swap es innecesario. De manera muy personal yo continúo dando importancia suficiente a la partición swap aún cuando el equipo en cuestión tenga memoria RAM "suficiente". Nunca se sabe si el día de mañana algún módulo de la memoria RAM fallará y el sistema tendrá necesidad de recurrir con mayor demanda a la partición swap.

Otra de las varias razones por las cuales el tamaño de la partición swap es importante es la capacidad que tienen algunos equipos para "hibernar", es decir, el equipo puede apagarse por completo sin necesidad de cerrar programas ni documentos, y puede desconectarse de la alimentación eléctrica para que más tarde, al volver a encenderse, se restauren todos los programas y documentos abiertos tal y como estaban cuando se apagó el equipo. Si el usuario desea usar la característica de "hibernación" o "suspensión" y si el equipo tiene 02 GB de memoria RAM entonces lo conveniente es que la partición swap sea también de 02 GB ya que es en dicha partición donde se almacenarán todos los datos que están en ese momento en la memoria RAM, pues los datos en la memoria RAM se perderán al apagarse el equipo, y al encenderlo nuevamente se cargarán a la memoria RAM los datos que quedaron almacenados en la partición swap de manera temporal.


SWAPPINESS

El acceso a los datos en la memoria RAM es mucho más rápido que el acceso a los datos en el disco duro, por lo tanto es posible configurar el sistema para que tenga un balance adecuado entre el uso de la memoria RAM y el uso de la partición swap. Dicha configuración se establece mediante un valor asignado a parámetro llamado swappiness. Dicho parámetro controla la tendencia que tendrá el kernel para vaciar datos de la memoria RAM y moverlos hacia la partición swap. Como se acaba de indicar, debido a que el acceso a los discos duros es mucho más lento que el acceso a la memoria RAM entonces es posible que las aplicaciones del sistema respondan lentamente si el sistema constantemente está vaciando datos de la memoria RAM hacia la partición swap.

El parámetro swappiness puede tener un valor nominal entre 0 y 100. Al decir valor nominal se debe entender que no representa un porcentaje del total de la memoria RAM, tampoco representa un porcentaje del total del tamaño de la partición swap, tampoco representa KiloBytes, MegaBytes, GigaBytes, etcétera. Es simplemente un valor nominal, como la escala que tiene una perilla que se gira para subir el volumen del 0 al 10.

Si el valor es 0 significa que el kernel debe evitar -por el mayor tiempo que le sea posible- vaciar datos de la memoria RAM hacia la partición swap. Es decir, prácticamente la partición swap estará sin usarse la mayor parte del tiempo.

Si el valor es 100 significa que el kernel, de manera agresiva y constante, vaciará hacia la partición swap los datos que estén en la memoria RAM. Es decir, prácticamente la memoria RAM estará disponible la mayor parte del tiempo.

En Kubuntu, el valor predeterminado de swappiness es 60. El reducir el valor de swappiness probablemente mejorará el desempeño general en una instalación típica de Ubuntu Desktop. En la página oficial de Ubuntu se recomienda establecer el valor a 10 (diez), pero uno es libre de experimentar. La versión Ubuntu Server tiene requisitos distintos para lograr un óptimo desempeño, y por ello el valor predeterminado es 60. Más adelante se explica cómo cambiar el valor a 10.

Por lo anterior el valor que se establezca para swappiness dependerá de varios factores, por resumir algunos: la cantidad de memoria RAM, el tamaño de la partición swap, la velocidad del disco duro, las aplicaciones que se ejecuten, la cantidad de usuarios que usen el equipo al mismo tiempo.

La siguiente imagen muestra un monitor de recursos en un sistema donde el valor de swappiness es 60. Se observa que el sistema está usando 299 MB de un total de 313 MB de memoria RAM. También se observa que se están usando 105 MB de un total de 424 MB de la partición swap:

swappiness 60


MODIFICAR EL VALOR DE SWAPPINESS

Para mostrar el valor actual de swappiness, el cual es almacenado en /proc/sys/vm/swappiness:

$ cat /proc/sys/vm/swappiness
60

Para cambiar el valor actual se debe usar (con privilegios de root) el comando sysctl (system control) y el parámetro -w (write) para asignar el nuevo valor. Con el propósito de ejemplificar en este tutorial el valor escogido es 10:

$ sudo sysctl -w vm.swappiness=10
[sudo] password for usuario:
vm.swappiness = 10

Para que el cambio sea permanente y se cargue dicho valor con cada arranque del sistema, es necesario modificar (con privilegios de root) el contenido del archivo /etc/sysctl.conf . Hay que agregar al final del archivo las siguientes líneas usando cualquier editor de texto:

##########################################
# Valor predeterminado: 60
vm.swappiness=10

La segunda línea es sólo un comentario para recordar el valor original. La tercer línea contiene el parámetro y el valor de swappiness.


FUENTES

Paginación de Memoria: http://es.wikipedia.org/wiki/Paginaci%C3%B3n_de_memoria
Paging: http://en.wikipedia.org/wiki/Paging#Linux
Swap FAQ: https://help.ubuntu.com/community/SwapFaq
swappiness: http://www.linuxinsight.com/proc_sys_vm_swappiness.html
Tuning swappiness: http://kerneltrap.org/node/3000
What exactly is swappiness?: http://www.pythian.com/news/1913/what-exactly-is-swappiness