Administrar la memoria virtual en Ubuntu 22.04 LTS

Publicado por P. Ruiz en

Probablemente ya sabrás que la memoria virtual es la técnica que utilizan los sistemas operativos modernos para que las partes de un proceso que no estén siendo utilizadas en un momento concreto, puedan residir en memoria secundaria.

Como recordarás de un artículo anterior, Windows crea un archivo de paginación donde guarda esas partes de los procesos que no están en la memoria principal (RAM). 

En el caso de Ubuntu, hace algún tiempo se produjo un cambio en este sentido: Antes de la versión 17.04, la información de paginación se almacenaba en una partición independiente que recibía el nombre de swap. Sin embargo, en las versiones actuales se crea un archivo de paginación al estilo de Windows. Este archivo se llama swapfile y se almacena en el directorio raíz del sistema de archivos principal.

Este comportamiento se producirá de forma predeterminada en todas las instalaciones que no utilicen volúmenes lógicos (LVM). Aún así, podemos volver al comportamiento tradicional creando la partición swap durante el proceso de instalación.

En cualquier caso, no existen diferencias de rendimiento cuando elegimos una partición swap o un archivo, siempre que éste no se encuentre fragmentado… Pero no olvidemos que ext4 (el sistema de archivos predeterminado de Ubuntu) es muy bueno luchando contra la fragmentación de archivos.

Donde sí podemos obtener una ventaja usando particiones es cuando tenemos varios sistemas operativos GNU/Linux instalados en el mismo equipo y todos ellos utilizan la misma partición swap.

Averiguar si un equipo utiliza una partición o un archivo para la paginación

En el caso de que necesites averiguar si tu instalación de Ubuntu está usando una partición swap o un archivo, la solución es muy sencilla. Basta con abrir una nueva ventana de terminal y escribir lo siguiente:

cat /proc/swaps

Puedes abrir la ventana de terminal usando la combinación de teclas Alt + Control + T.

Si tu equipo utiliza un archivo de paginación, obtendrás una salida como esta:

Observa que, en la columna Type aparece el texto file (archivo).

Administrar-la-memoria-virtual-en-Ubuntu-22-04-LTS-001

Y en el caso de que se definiera una partición, la salida que obtendrás será parecida a esta:

Ahora, como cabía esperar, en la columna Type aparece el texto partition (partición).

Administrar-la-memoria-virtual-en-Ubuntu-18-04-LTS-008

Otra forma consiste en consultar el contenido del archivo fstab. Puedes usar el comando grep para buscar únicamente las líneas donde aparezca la palabra swap. Por ejemplo, el comando podría ser este:

grep swap /etc/fstab

El archivo /etc/fstab se utiliza para definir el modo en el que deben montarse en un sistema GNU/Linux las diferentes particiones, dispositivos de bloques, etc.

De nuevo, cuando tu equipo utilice un archivo de paginación, la salida que obtendrás será parecida a esta:

Vemos que la identificación del dispositivo es el nombre del archivo de paginación.

Administrar-la-memoria-virtual-en-Ubuntu-22-04-LTS-002

Mientras que, si utiliza una partición, será algo como esto:

En este caso, el identificador del dispositivo es un punto de montaje (otras veces podrías obtener el UUID del dispositivo)

Administrar-la-memoria-virtual-en-Ubuntu-18-04-LTS-010

Cómo se comporta la memoria virtual

Independientemente de que hayamos configurado una partición o un archivo de paginación, un aspecto que podemos cambiar fácilmente es el modo en el que se comporta la memoria virtual. Este proceso lo haremos usando Ubuntu 22.04 LTS, pero debes tener presente que es idéntico para otras distribuciones GNU/Linux.

De forma predeterminada, el sistema trata de que haya siempre una porción considerable de memoria RAM disponible. Así, si en un momento determinado ejecutas una aplicación nueva, o una de las aplicaciones que ya estás ejecutando solicita una gran porción de memoria, el sistema podrá responder de forma eficiente.

Este planteamiento, que a priori parece interesante, hace que siempre tengamos una parte de la memoria principal sin utilizar, mientras que se están produciendo operaciones de entrada/salida con el disco duro que hacen bajar el rendimiento. Esto no quiere decir que debamos eliminar el intercambio de memoria, pero debemos pensar que su configuración predeterminada trata de dar respuesta a una gran diversidad de situaciones.

En ordenadores con poca memoria RAM, en servidores con una gran actividad u otros equipos que ejecuten aplicaciones con grandes necesidades de RAM, el uso de los valores predeterminados pueden ser adecuados (incluso puede que sea buena idea ampliarlos).

Sin embargo, en ordenadores con una cantidad de memoria RAM suficiente, u ordenadores poco potentes en los que la sobrecarga que supone el intercambio de memoria hace bajar considerablemente el rendimiento, puede ser una gran idea reducir el uso de la memoria de intercambio.

Si utilizas discos SSD, reducir las operaciones de escritura sobre ellos puede aumentar considerablemente su vida útil.

Una vez que tenemos esto claro, probablemente estarás haciéndote una pregunta: ¿cómo decide el sistema operativo el límite de ocupación de la memoria RAM a partir de la que debe paginar información a disco? Pues bien, la respuesta es muy sencilla. Lo establece un valor almacenado por el sistema operativo llamado swappiness. Este valor es un número comprendido entre 0 y 100.

Para entender cómo funciona, vamos a realizar algunas apreciaciones:

  • Si swappiness contiene el valor 0, el sistema operativo no utilizará el área de intercambio.

  • Si swappiness contiene el valor 100, el sistema estará tratando de almacenar en memoria secundaria la mayor cantidad posible de memoria RAM.

  • El valor predeterminado de swappiness en Ubuntu 22.04 LTS es de 60, lo que hace que el sistema trate de disponer siempre de una cantidad considerablemente alta de memoria RAM desocupada.

  • Este valor predeterminado es válido en servidores con una una carga de trabajo media-alta.

  • En la mayoría de los equipos actuales, quizás sería más apropiado un valor próximo a 10, aunque, si tienes un equipo con menos de 1 GB de RAM, podríamos llegar hasta 5.

En cualquier caso, lo primero será asegurarnos del valor de swappiness que tenemos en nuestro sistema. Algo tan sencillo como abrir una ventana de terminal y escribir lo siguiente:

cat /proc/sys/vm/swappiness

Como cabe esperar, comprobamos que contiene el valor predeterminado.

Administrar-la-memoria-virtual-en-Ubuntu-22-04-LTS-003

Cambiar el modo en el que se comporta la memoria virtual

Si quieres cambiar el valor de swappiness para la sesión actual, solo tienes que ejecutar el siguiente comando:

sudo sysctl -w vm.swappiness=10

Establecemos el nuevo valor.

Administrar-la-memoria-virtual-en-Ubuntu-22-04-LTS-004

Ahora, usamos el comando del apartado anterior para comprobar que el valor ha cambiado:

Comprobamos que el valor ha cambiado.

Administrar-la-memoria-virtual-en-Ubuntu-22-04-LTS-005

Lógicamente, si al utilizar tu equipo notas que el cambio no ha sido adecuado para el uso que haces de él (por ejemplo, que en lugar de aumentar el rendimiento, disminuye), puedes ejecutar de nuevo la orden anterior para volver a cambiarlo hasta encontrar el equilibrio correcto.

En cualquier caso, el nuevo valor de swappiness se perderá la próxima vez que reinicies, recuperando su valor predeterminado. Si después de probar, quieres que el cambio se haga definitivo, debes modificar el archivo sysctl.conf.

Como se trata de un archivo de texto plano, puedes utilizar el editor de textos que prefieras, siempre que lo ejecutes con privilegios administrativos. Por ejemplo, yo utilizaré gEdit:

sudo gedit /etc/sysctl.conf

Editamos el archivo de configuración

Administrar-la-memoria-virtual-en-Ubuntu-22-04-LTS-006

Una vez abierta la ventana del editor de texto, nos desplazamos hasta el final del archivo y añadimos lo siguiente:

vm.swappiness=10

… Y cuando hayamos acabado, guardamos los cambios.

Después, puedes cerrar el editor.

Administrar-la-memoria-virtual-en-Ubuntu-22-04-LTS-007

Comprobar el cambio

Para comprobar que funciona, sólo tienes que reiniciar tu ordenador y realizar la comprobación que hacíamos al principio del artículo.

Por último, si quieres saber, en un momento concreto, el uso que se está haciendo de la memoria, puedes recurrir al siguiente comando:

free

Salida del comando free.

Administrar-la-memoria-virtual-en-Ubuntu-22-04-LTS-008

En nuestro ejemplo, puedes comprobar que de los 4 GiB de memoria RAM que tenemos en el equipo, en ese momento se estaban usando aproximadamente 0,95 GiB.

En cuanto a la memoria de intercambio, de los casi 2 GB que tenemos definidos, no se está usando nada. Son los efectos inmediatos del ajuste que hemos hecho en este artículo.

Si necesitas más detalles, puedes recurrir a la página de documentación de Ubuntu: http://manpages.ubuntu.com/manpages/trusty/es/man1/free.1.html.

Y hasta aquí nuestro artículo de hoy. Espero que te resulte útil.