X

Optimizar el uso de la memoria Swap

Optimizar el uso de la memoria swap forma parte de una serie de post para optimizar el uso de memoria RAM en nuestro sistema operativo y de esta forma poder obtener el máximo rendimiento a nuestro equipo informático. El conjunto de post que se acaban de mencionar son los siguientes:

  1. Liberar memoria cache de nuestra RAM.
  2. Limitar el uso de nuestra memoria Swap y limpiarla en el caso que se active.
  3. Usar la RAM más eficientemente con ZRAM.
  4. Acelerar el inicio de nuestras aplicaciones con Preload.
  5. Acelerar el inicio de nuestras aplicaciones con Prelink.
  6. Aligerar el rendimiento de nuestro sistema operativo con Zswap.

¿Qué es la memoria Swap?

La Swap o espacio de intercambio es un espacio en nuestro disco duro que se usa para almacenar los datos e imágenes de procesos que no pueden ser almacenados en nuestra memoria RAM por falta de capacidad. Por lo tanto la swap es una forma para liberar carga de nuestra memoria RAM.

En otras palabras la Swap es el equivalente de lo que se conoce como archivo de paginación en Windows. La gran mayoría de usuarios de Windows probablemente no conocen la existencia de los archivos de paginación o swap. Los usuarios de Linux si conocen su existencia porqué en el momento de la instalación se tiene que realizar una partición de swap en nuestro disco duro mientras que en windows esto no es necesario. El mismo windows te genera de forma poco transparente un archivo de paginación que se incremente o disminuye de tamaño en función de la carga que estemos dando a nuestro equipo.

Nota: En el caso que en Linux nos olvidemos de crear una partición de intercambio cuando estamos instalando nuestro sistema operativo no implica tener que volver a instalar el sistema. Siempre podemos modificar nuestra tabla de particiones de nuevo y crear la particion Swap. O también existe la opción de generar un archivo de intercambio Swap al estilo windows. En un futuro post se explicará como crear un archivo que funcione como memoria de intercambio swap.

¿Por qué Linux necesita utilizar la swap?

Linux necesita la memoria Swap porqué es un forma de ampliar la memoria RAM de nuestro sistema operativo en el caso que esté llena.

A medida que vamos ejecutando aplicaciones en nuestro sistema operativo estas se cargan en la memoria RAM. A medida que vayamos cargando aplicaciones nuestra memoria RAM se va llenando y puede llegar al punto que este prácticamente llena. En el momento que la memoria RAM se llene completamente e intentemos ejecutar otras aplicaciones nuestro sistema operativo simplemente se saturará, se volverá inestable o nos generará algún tipo de error ya que no tiene recursos para iniciar más aplicaciones de forma simultanea.

Es en esta situación es donde actúa la swap. A partir de un cierto nivel de carga en la RAM, que nosotros podemos controlar mediante el parámetro swappines, el Kernel de nuestro linux buscará las imágenes de procesos que menos usamos y tengamos cargados en nuestra memoria RAM y los moverá a nuestro disco duro en la zona que denominamos como área de intercambio o swap. De está forma estamos liberando memoria RAM para poder cargar más procesos.

Además Linux necesita un mínimo de memoria Swap para trabajar de forma eficiente cuando nos quedamos sin memoria. La explicación de esta afirmación es la siguiente:

En la memoria RAM se guarda diverso tipo de información:

Tipo 1 – Información que siempre tiene que estar almacenada en la memoria RAM y en ningún caso podrá ser swapeada.

Tipo 2 – Información que se puede swapear y que además de estar en la RAM también está respaldada en nuestro disco duro. Esta información, en el caso de no existir swap, se puede eliminar de la RAM y que siempre podemos recuperarla porqué hay una copia en el disco duro.

Tipo 3- Información que se puede swapear pero que no dispone de una copia de respaldo en el disco duro.

Ahora imaginemos que nuestro ordenador se está quedando sin memoria RAM:

En el caso de tener una partición de intercambio el kernel podrá eliminar o intercambiar información clasificada dentro del tipo 2 y 3.

En el caso que no tengamos una partición de intercambio, nuestro kernel solo se podrá plantear eliminar información clasificada como tipo 2. ¿Por qué?

Hay que tener en cuenta que la información de tipo 2 no se puede swapear, porqué no existe la partición de intercambio, pero se puede eliminar ya que existe una copia de respaldo y por lo tanto en caso de hacer falta siempre la podemos volver a recuperar. La información de tipo 3 nunca la podemos eliminar ya que no tiene respaldo alguno y no la podemos swapear por no existir en la área de intercambio. Esto implica que se tiene que quedar a la fuerza en la memoria RAM.

Por lo tanto si no tenemos espacio de intercambio el rendimiento no será el óptimo en caso de quedarnos sin memoria. Puede darse perfectamente el caso que la solución ideal para no notar una pérdida de rendimiento sea eliminar información del tipo 3. Pero al no existir memoria de intercambio tendrá que eliminar información del tipo 2 pudiendo perjudicar notablemente el rendimiento de nuestro sistema ya que no es la solución ideal.

¿Por qué debemos minimizar el uso de la swap en nuestros ordenadores?

En ordenadores con prestaciones normales, o incluso de prestaciones reducidas como mi Eee PC, seguro que notaréis que en el momento que se activa la memoria Swap todo empieza a ir más lento. ¿Por qué en el momento de activarse la swap el ordenador se ralentiza?

Simplemente porqué las librearías y procesos necesarios para poder ejecutar algunas de las aplicaciones se hallan en una parte del disco duro denominado swap en vez de a la memoria RAM. Cómo todos saben la velocidad de ejecución de la información almacenada en la memoria RAM es infinitamente superior a la que tenemos en nuestro disco duro. Por lo tanto es normal que todo vaya mucho más lento.

Otro motivo de la lentitud que experimentamos es la posible aparición de hiperpaginación. La hiperpaginación causará que haya una serie de librerías que estén intercambiándose continuamente de la memoria RAM a la Swap y de la Swap a la RAM causando lentitud y sobrecarga en el sistema. Los motivos de la hiperpaginación pueden ser que nuestro ordenador tenga muy poca RAM o que los algoritmos de intercambio de procesos de un sitio a otro estén mal implementados.

Pero tenemos que tener en cuenta que no en todos los equipos es interesante minimizar el uso de la Swap. Hay casos particulares que incluso pueden ser necesario no minimizar el uso de la memoria Swap. Estos casos particulares pueden ser los siguientes:

  1. Servidores en los que exista una alta carga de trabajo. Hay que tener en cuenta que los servidores acostumbran a lidiar con bases de datos y archivos de gran tamaño.
  2. En el caso que dispongamos de un ordenador que tenga muy poca memoria RAM disponible. Este caso si estamos hablando de ordenadores relativamente actuales nunca se dará.
  3. Ordenadores que aunque dispongan de mucha memoria RAM tengan que ejecutar aplicaciones que hagan un gran consumo de RAM. Por lo tanto tenemos que ir con cuidado en el caso que tengamos que usar aplicaciones que consuman gran cantidad de RAM.
  4. Usuarios que tengan que compilar aplicaciones que sean muy grandes.
Nota: En prácticamente el 99% de los ordenadores actuales podemos minimizar el uso de la memoria swap. Los 4 casos que acabamos de citar prácticamente no se dan en la mayoría de usuarios. Además hoy en día los ordenadores tienen mucha RAM en comparación con los ordenadores de años atrás.

Cantidad de memoria Swap que es aconsejable asignar

En internet encontrareis multitud de opiniones sobre la memoria swap que se debe asignar para que nuestro sistema operativo funcione adecuadamente. Una teoría muy extendida es la que se presenta a continuación:

  1. En el caso que tengamos 1 GB de RAM o menos deberemos tener un tamaño igual a nuestra RAM. Por lo tanto si tenemos 512 Mb de RAM deberemos tener 512 Mb de Swap
  2. En el caso que tengamos entre 2 y 4 GB de RAM la swap deberá ser la mitad de nuestra memoria RAM. Así por lo tanto si tenemos 2Gb de RAM deberíamos tener 1Gb de Swap
  3. En el caso de equipos más modernos con más de 4Gb de RAM como máximo deberíamos tener 2 Gb de memoria de intercambio.

No obstante según mi punto de vista el criterio que deberíamos seguir es el siguiente:

  1. Primero tenemos que saber la memoria RAM que tiene nuestro ordenador. Por ejemplo pongamos que tenga 1 Gb de RAM.
  2. A continuación tenemos que tener una idea del consumo máximo de RAM que tendremos con nuestros equipo en la peor de las situaciones. Por ejemplo considero que el uso máximo de memoria RAM se dará cuando use simultáneamente el navegador, Libreoffice, el gestor de correo y el reproductor de música. Estimo que con todas estas aplicaciones abiertas mi consumo total Será de 2 GB.
  3. Considerando que tenemos un 1Gb de RAM y en el peor de los casos vamos a llenar 2 Gb implica que tenemos que asignar 1 Gb de Swap más un margen de seguridad de 512Mb. Por lo tanto en el caso presentado 1.5 Gb de Swap es suficiente.
  4. Para finalizar hay que tener claro si tendremos la necesidad de poner nuestro equipo en hibernación. En el momento que hibernamos nuestro equipo lo que estamos haciendo es volcar la totalidad de imágenes de procesos de nuestra memoria RAM a nuestra memoria Swap. Por lo tanto en el caso de querer hibernar el equipo como mínimo necesitaremos nan memoria Swap igual a nuestra RAM. En el caso que hemos planteado, en el caso que quiera hibernar mi equipo, incrementaría la partición de memoria Swap de 1.5 Gb a 2.5Gb.

Minimizar el uso de la memoria Swap

Como hemos visto en los puntos anteriores, en la gran mayoría de casos lo ideal es evitar o retardar el uso de la swap en nuestro sistema operativo y usar la memoria RAM siempre que sea posible. De está forma el funcionamiento de nuestro ordenador será mucho más rápido y fluido. Además los usuarios que dispongan de un disco duro SSD puede que no deseen que se escriba información en su disco duro ya que la vida de un disco duro SSD viene determinado por un número límite de escrituras.

Quien decide el momento en que se empiezan a trasvasar imágenes de procesos de la RAM a la Swap es el Kernel. Como Linux es un sistema operativo abierto podemos hacer que el Kernel de Linux esperé hasta cuando la memoria RAM este casi llena para que empezar el trasvase. Tan solo tenemos que modificar el valor de swappiness de nuestro sistema operativo para indicarle al kernel de linux que de más prioridad al uso de RAM que al uso de Swap.

El valor de swappiness puede comprender un valor entre 0 y 100. Si el valor es 0 se evitará el intercambio de información entre la RAM y la Swap, mientras que si elegimos un valor 100 el intercambio se estará realizando constantemente  La mayoría de distribuciones Linux vienen preconfiguradas con un valor de swappiness de 60. Este valor es probablemente correcto para el uso de servidores y superordenadores pero es claramente excesivo para usuarios domésticos como nosotros.

Por lo tanto en nuestro caso podemos recudir muy drásticamente el valor de la swappiness por defecto hasta valores de 10 o 5. Para ello lo primero que tenemos que hacer es abrir una terminal y teclear el siguiente comando:

cat /proc/sys/vm/swappiness

La salida será el valor actual de swappiness que tenemos asignado. Si no habéis tocado nunca este parámetro es probable que el valor que os salga en pantalla sea 60, ya que es el valor por defecto que usan la mayoría de distros de Linux. Si es este vuestro caso y tenéis un valor de 60 podemos reducir drásticamente el uso de swap.

Si queremos reducir el valor de Swappiness de 60 a 10 tan solo tenemos que abrir una terminal y escribir el siguiente comando:

 sudo sysctl -w vm.swappiness=10

En estos momentos ya tenemos fijado el valor de swappiness en 10 y nuestro sistema operativo tenderá a usar mucho menos swap que cuando teníamos fijado el valor en 60.

Una vez tenemos el nuevo valor, lo más aconsejable es usar el ordenador durante un periodo de tiempo razonable para asegurar que el rendimiento que obtenemos con el nuevo parámetro es aceptable y también para comprobar que el sistema sea estable.

Una vez que estamos seguro que nuestro sistema rinde mejor y no genera inestabibilidad en el sistema lo que haremos es hacer este cambio permanente. Así evitaremos que cada vez que arranquemos el ordenador tengamos que cambiar el valor de swappiness de 60 a 10.

Para hacerlo persistente el valor de swappiness 10 abrimos una terminal y tecleamos:

sudo gedit /etc/sysctl.conf

Justo al final del fichero introducimos el siguiente comando:

 vm.swappiness=10

Guardamos el fichero y la próxima vez que arranquemos nuestro ordenador ya tendremos ajustado el valor de swappiness a 10. Si queremos realizar la comprobación tan solo tenemos que abrir una terminal y teclear el siguiente comando:

cat /proc/sys/vm/swappiness

Liberar la memoria Swap una vez está en uso

Una vez se activa nuestra memoria Swap nuestro sistema se acostumbra a saturar y ralentizar. Una solución para solucionar este problema es reiniciar el equipo pero existen soluciones para liberar la memoria Swap y no tener que apagar el ordenador. Para evitar apagar el equipo podemos proceder de la siguiente forma:

Lo que realizaremos es traspasar el contenido que tenemos almacenado en nuestra memoria Swap hacia la memoria RAM. Por lo tanto lo primero que realizaremos es asegurarnos que la memoria RAM tiene capacidad libre para poder albergar el contenido que está guardado en la Swap. Para hacer esto abrimos una terminal y tecleamos el comando:

 free

El comando free nos dará la salida que podeís observar en la siguiente captura de imagen:

Como podemos ver en la captura en nuestra memoria Swap tenemos almacenado 8Kb. Nuestra memoria RAM tiene 78388 Kb libres. Por lo tanto podemos traspasar el contenido de la memoria Swap a la RAM sin tener ningún tipo de problema.

Para realizar el traspaso abrimos la terminal y escribimos el siguiente comando para transferir el contenido de un lado a otro:

sudo swapoff -a ; sudo swapon -a

Ahora volveremos a teclear el comando:

free

Y efectivamente en la siguiente captura de pantalla podemos confirmar que la operación ha tenido éxito, ya que la memoria Swap ahora está completamente libre:

El proceso que acabamos ver lo podemos automatizar mediante un script y ejecutarlo periódicamente a las 12 de la noche por ejemplo. Para ello tan solo tenemos que añadir la siguiente frase:

swapoff -a && swapon -a

En el script que aprendimos a generar en el siguiente post:

https://geekland.eu/liberar-memoria-cache/

Por lo tanto el contenido del script para limpiar la memoria cache de la RAM y traspasar el contenido de la memoria Swap a la RAM es el siguiente:

 #!/bin/bash
echo “Limpiando la caché~ “;
sync ; echo 3 > /proc/sys/vm/drop_caches
echo “Limpiando Swap~ “;
swapoff -a && swapon -a

Fuentes

http://es.wikipedia.org/wiki/Espacio_de_intercambio

Categorías: Linux

Ver los comentarios (33)

  • Hola,

    algunas observaciones...

    La swap no es lo mismo que el fichero que Microsoft llama "memoria virtual" que, como bien apuntas, tiene que cambiar de tamaño (con el coste que eso supone) cada vez que un proceso hace un malloc(). Eso es una chapuza (y supongo que de ahí que, habiendo patentado -que no inventado- los escritorios virtuales, aún no los hayan implementado nunca: Seria tentar demasiado la suerte).

    Bromas aparte, en sistemas operativos, se llama "memoria virtual" a otra cosa (que tampoco es la swap) que es el modo en que, en arquitecturas de éste siglo con ayuda del hardware, el sistema operativo gestiona TODOS los dispositivos de memoria (el almacenamiento secundario -como discos duros- también es memoria) con un un objetivo (que después te cuento).

    Aunque coloquialmente cuando hablamos de "memoria" nos estamos refiriendo a la RAM, hay muchos tipos de memorias y se clasifican segun vários parámetros:

    * Si son volátiles (se pierde su contenido al desconectarlas), como la RAM o no, como los discos duros.
    * Si son de lectura y escritura o sólo lectura (como las ROM)
    * El modo de acceso: Aleatorio (RAM), secuencial (cinta), pseudoaleatorio (HD -Puede acceder a los datos aleatoriamente pero necesita un tiempo para posicionar el cabezal y rotar el disco-).

    Además, tradicionalmente, las memorias de acceso aleatorio, especialmente las más rápidas, han sido siempre muy caras (y por lo tanto pequeñas) en comparación con sus hermanas pseudoaleatorias los discos duros. Que, además, son no volátiles y nos permiten almacenar datos por largo tiempo, incluso aunque se apaguen.

    Ésto da lugar a la separación entre lo que se conoce como "almacenamiento primario", que son las memorias (RAM) con las que trabaja diréctamente el procesador y el almacenamiento secundario (Discos duros y otros) que internamente cuelgan en realidad del sistema de E/S a dispositivos, mucho más lento que el bus de la RAM.

    En resumen: Tenemos un almacenamiento primario muy rápido pero de tamaño reducido y un almacenamiento secundario de tamaño enorme pero bastante lento.

    El objetivo del que te hablaba antes consiste en conseguir que «Que la memoria primaria tienda a ser tan grande como la secundaria y la secundaria tienda a ser tan rápida como la primaria».

    Ésto se consigue grácias al sistema de memoria virtual que consiste "a groso modo" en suponer que tenemos tanta memoria como queramos y dividir ésta en páginas que son asignadas a los distintos procesos a medida que éstos las solicitan.

    Pero éstas páginas no tienen porqué estar almacenadas siempre en RAM. el sistema operativo puede decidir en cualquier momento mover una página a swap liberando la RAM que ocupaba para otros menesteres.

    Si el proceso vuelve a usarla (de ahí la necesidad de soporte hardware), se disparará una interrupción que avisará el sistema operativo quien la volverá a cargar en memoria (lógicamente no en el mismo sitio, pero no es problema porque los programas usan direcciones de memoria virtual, no de memoria física) sin que éste se de cuenta.

    Evidentemente ésto generará un pequeño retardo cuando el proceso, que habia estado inactivo, "vuelve a la acción", pero una vez vuelta a cargar la página ya la tendrá de nuevo en RAM, por lo que es mucho más eficiente que usar el disco directamente.

    El trabajo del sistema operativo es saber cuando conviene pasar a swap una página de memoria o no.

    Desgraciadamente no podemos predecir el futuro (cuando un usuario va a volver a usar una aplicación que tenia abierta, recibiremos una conexión a un servicio de red, etc...). Pero sí podemos saber qué páginas de memoria llevan más tiempo sin ser accedidas e, incluso, con qué frecuencia son usadas.

    De éste modo se consigue la primera parte del objetivo mencionado.

    La segunda parte, "que la memoria secundaria tienda a ser tan rápida como la primaria" se consigue de un modo similar: Los procesos, lógicamente, no acceden directamente a los dispositivos físicos, sino al VFS (Virtual FileSystem) y éste tiene una capa de caché que, por cierto, usa memoria... de modo que cuando escribimos en un fichero no tenemos que esperar a que los datos se escriban físicamente al disco para poder leerlos.

    Es más: Incluso podríamos modificarlos antes de que llegaran físicamente al disco y los datos rectificados nunca llegarian al disco porque han sido sobreescritos aún estando en caché.

    Evidentemente, si queremos leer un fichero de 1TB de principio a fin, lo leeremos, con suerte, a la máxima velocidad que permita (físicamente) el dispositivo. Pero eso no es ni de lejos lo más habitual.

    De hecho, no es nada extraño que haya ficheros que sean accedidos con mayor frecuencia que páginas de memoria de otros procesos.

    Por eso es tan mala idea eso que se dice a veces de que "si tienes mucha RAM no hace falta swap" porque, aunque no te quedes sin memoria para los procesos que tengas en ejecución, es posible que obligues al sistema a hacer más accesos a disco de los que serian necesarios si pudiera tirar un par de páginas a swap y usar la memoria liberada para cachear el acceso a disco.

    Además (no quiero enrollarme más con el tema), pero Linux concretamente tiene uno de los mejores sistemas de gestión de memoria que existen. En concreto porque en su momento fué el primero y no me consta que ningún otro lo haya implementado todavia en fusionar la paginación de memoria con los buffer de disco (el "buffer/caché" de linux) de modo que si vários procesos abren el mismo fichero, si no hacen modificaciones, sólo habrá una cópia en memória. ...Y si las hacen, "también", sólo que las páginas modificadas por cada uno se duplicarán en posiciones distintas de la memória, pero no se derrochará RAM en mantener cópias de las partes idénticas.

    Por último (y termino ya...) un apunte sobre lo de la inestabilidad del sistema al terminarse la memoria.

    Evidentemente que se termine la memoria es un problema "gordo" (lo peor que puede suceder) pero incluso en ese caso, el sistema própiamente no se vuelve inestable, sino que tiene que solucionar un problema muy gordo "al estilo Rajoy" (recortando).

    Rajoy recorta en sanidad y subvenciona los toros y los colegios religiosos y Linux empieza por los procesos que más memoria estén consumiendo.

    ...sólo que, sobretodo antiguamente, uno de esos procesos solían ser las X, por lo que todo el entorno gráfico (y los procesos que colgaran de él) se iban a la mierda y, lógicamente, por el usuario de a pié eso no es visto con muy buenos ojos... Pero tampoco a nadie le gusta que le corten una pierna que se le ha cangrenado :-D

    De todos mods, hoy en dia es más habitual que el elegido sea Firefox... :-D

    • Joan miquel

      Gracias por tu buen por tu detallada explicación. Aportes como los tuyos siempre serán bienvenidos por mi parte. Espero que no sea el último que hagas.

  • Hola, este comentario es sólo para decir que no comparto la forma que tienes de calcular la swap necesaria.

    Primero porque uno se plantea cuanta swap debe instalar sólo cuando va a instalar el sistema operativo, siendo difícil cambiar de idea posteriormente. En ese punto es complicado saber cuanto van a consumir los programas que se piensan usar.

    Segundo porque la swap es un parche. Una salida económica ante la falta de memoria RAM. Si tienes la posibilidad de calcular cuanta memoria ocupan tus programas y, como en el ejemplo, es mucho más que la que tienes (en el ejemplo es el doble) lo mejor que puedes hacer es comprar más RAM. La penalización el rendimiento por usar la swap es tan importante, que al precio de la memoria no merece la pena.

    Tercero porque esa estimación lo más probable es que no sea correcta. Uno puede ver cuanta memoria virtual usa un programa pero otra es cuanta necesita realmente cuando se está ejecutando en una localidad particular. El sistema es lo bastante listo para asignar sólo la RAM que se necesita y no toda la que demanda el programa y ocupa de forma virtual. Eso significa que la suma de toda la memoria virtual de todos los programas que sueles usar si es muy posible que sea superior a la RAM de la que dispones. Pero la RAM usada real no. Y el problema es que calcula la RAM real que se necesita no es sencillo. Puedes monitorizar la que asigna el sistema pero depende de cosas tales como: el patrón de uso, otras aplicaciones en el sistema, la cantidad de RAM disponible, etc.

    Por último decir tal y lo como lo comentas parece que si tienes más RAM que swap, puedes prescindir de esta última.

    Ya traté este tema hace un tiempo en un viejo blog.

    Y el hecho es que no se debe porque en un proceso hay páginas no anónimas (respaldadas contra un fichero) y páginas anónimas (respaldadas contra la swap). Sin swap el sistema no tiene donde volcar estas últimas, por lo que si la presión aumenta sobre el sistema de memoria virtual, se verá obligado a quitar RAM sólo a las páginas no anónimas. Es decir, que no tendrá posibilidad de escoger las más adecuadas.

    Por eso siempre se necesita swap y por eso es la regla esa de al menos 2GB para equipos de más de 4GB.

    • Hola Jesús!

      En el punto 1. Creo que la discusión es inútil. Los 2 métodos son buenos. Yo pienso que si que hay que plantearse la RAM que usas. Además creo que esto no es un punto tan complicado. Si se prefiere seguir el primer método seguramente nadie se quedará corto con la swap, o quizás si como veras más adelante. Pero en el caso de quedar corto no estoy de acuerdo que no hayan soluciones. Como mínimo hay 3 para evitar este problema. Instala la Swap dentro de un volumen lógico (LVM) y así siempre podrás expandirla. Puedes crear un archivo de intercambio aunque que como dice Joan Miquel es una solución chapucera. Si tienes espacio en el disco duro crea una segunda partición de Swap. Como ves de soluciones hay. Por cierto el método tradicional es peligroso también. Solo planteate el caso que tienes 1Gb de RAM instalado. Por lo tanto según el método tradicional tienes que instalar 1Gb de Swap. Imagínate que tendrás un consumo de 2.5 Gb. Por lo tanto en vez de 1 Gb de Swap le tendrías que asignar 1.5 Gb. Por lo tanto pienso que es mejor usar el método que uso yo. Pero cualquiera es libre de hacer lo que quiere. Estoy de acuerdo que el caso que expongo no es muy real y que lo ideal seria comprar más RAM pero a veces esto no es posible. A veces si tienes ordenadores antiguos y con pocos recursos no es una opción y si quieres alargar la vida del ordenador la solución es poner más swap.

      En el punto 2: Estoy plenamente de acuerdo contigo. Pero a veces no es posible ampliar la memoria de ciertos ordenadores.

      En el punto 3: Creo que no es tan difícil hacer una estimación. Con el comando free puedes ver exactamente el estado de tu memoria. Si abres todos los programas que usaras y abres una terminal y pones el comando free podrás hacer una muy buena estimación.

      Para finalizar en ningún momento estoy diciendo que la swap no sea necesaria. En el post solo estoy diciendo que si vas sobrado de RAM lo mejor es minimizar su uso bajando el valor de swappiness. Si estuviera diciendo que no es necesaria hubiera propuesto y instalar linux sin la partición swap. Mi ordenador tiene 3 Gb de RAM y muy raramente se activa la Swap. Por el uso que doy a mi ordenador no le voy a dar 2Gb de Swap. Actualmente tengo una giga de swap y si tuviera 512 Mb la verdad es que aun me seguiría sobrando mucha swap para el uso que le doy al ordenador.

      Por cierto el post que escribiste me ha gustado. Me gustaría usar una parte de tu post para añadirla en el apartado de porqué linux necesita usar Swap. Espero que no tengas inconveniente.

      • ???

        Dónde he dicho yo que la swap sea "una solución chapucera"??

        Lo chapucero es la "memoria virtual" de Windows, SOBRETODO porque (salvo que hayan evolucionado en las últimas versiones que no lo sé, pero tampoco lo creo...) no hace ninguna gestión real de la memoria sino se limita a volcar páginas a ese fichero cuando se termina la memoria física. No obteniendo ningún beneficio de esa "swap" (que no es tal) antes ni, sobretodo, después: cayendo estrepitosamente el rendimiento llegado ese punto.

        Lo de meterlo en un fichero es el menor de los disparates, y lo és porque, encima, cambia de tamaño dinámicamente según el uso (con el overhead que eso supone). Pero eso es una memez.

        Meter swap en un fichero óbviamente no es una solución tan buena como una partición pero es una solución más que respetable SI LA PARTICIÓN de swap que tienes se te queda corta.

        Sobretodo porque, con el comando swapon (o las opciones de la correspondiente línea en /etc/fstab) puedes especificar una prioridad menor para esa swap de momento que sólo se use cuando se llene la primera (cosa que supuestamente sucederá en raras ocasiones).

        El uso de un fichero no es mucho menos eficiente que el de una partición porque, aunque tiene la indirección del sistema de ficheros, quien gestione éste es el kernel y, por lo tanto, puede acceder diréctamente sin pasar por las llamadas a sistema que tendria que utilizar un proceso normal.

        La posible fragmentación de los sistemas de ficheros es otro problema. Pero los sistemas de ficheros modernos (desde ext2 hasta Reiser, pasando por XFS) se fragmentan muy poco y es altamente probable que el fichero quede de una sóla pieza. Sobretodo porque no crece desde el momento en que se creó (ojo: si quieres aumentar uno de tamaño, nunca hagas un "dd ... >> swapfile" o similar antes del mkswap para ahorrar tiempo: bórralo y créalo de nuevo ;-)

        Por otro lado, el lvm no es en sí un problema, pero tampoco una ventaja. Añade una nueva indirección e incluso una posible fragmentación puesto que, si aumentas de tamaño la partición, es posible que los nuevos bloques no sean contiguos. ...aunque pueden estar físicamente en dispositivos distintos lo que puede facilitar su paralelización.

        Pero, incluso en ese caso, en mi opinión, mucho mejor si añades nuevas particiones (o ficheros si es preciso) de swap en lugar de ampliar una existente. Independientemente de que uses LVM (yo lo uso en muchos casos) o no.

        PD: Algo que no hemos comentado y que cambia todo lo anterior, son las unidades SSD. No es recomendable poner particiones de swap en esos dispositivos porque tienen una durabilidad mucho más limitada que los discos duros mecánicos (y un precio que roza el de la RAM...)

        Hay quien recomienda no poner swap en esos casos. Yo no estoy nada de acuerdo.

        Hace poco le puse uno al portàtil y aún así le puse una pequeña partición swap, pero también amplié la memoria a 2GB (porque, por desgrácia, no me acepta más).

        Más recientemente he montado un sobremesa nuevo para virtualización y pruebas. A éste le puse 16GB de RAM y un disco SD de 120GB. Aunque también le puse un HD mecánico de 2TB (y ya podeis imaginar dónde ha ido la swap ;-)).

        ...pero si no le hubiera puesto el disco de 2TB, le habria enchufado alguno viejo para la swap.

        Se trata de valorar lo que uno quiere, y los medios que tiene para determinar la mejor opción... ;-)

        • Hola Joanmi

          No lo has dicho. Has dicho que lo chapucero crear un archivo de swap en Linux al estilo windows.

          Por tus comentarios me hago la idea que eres partidario de modificar lo menos posible el comportamiento estandard de la mayoría de distros de linux. ¿Es así?

          En el post recomiendo que en la mayoría de casos es provechoso reducir el uso de Swap. Lo pongo porqué he experimentado bastante con un notebook con pocos recursos. Y la verdad es que el notebook me rinde mucho mejor con una valor de 10 que con un valor de 60. De aquí nació la idea de escribir el post.

          Muchas gracias por tus aportes crack.

    • Hola Jesús.

      De ningún modo estoy de acuerdo en que la swap sea un "parche" a la falta de memoria (salvo que puedas permitirte más RAM que espacio tengas en discos duros ...cosa inviable en cualquier plataforma).

      Como tu muy bien dices después, la swap permite liberar memoria que no está siendo usada para otros usos. Pero no sólo para otros procesos, sino también para caché de disco lo que aumenta mucho el rendimiento efectivo de éstos.

      Por eso, si miramos el uso de memoria de cualquier GNU/Linux (o cualquier sistema operativo con una gestión de memoria decente) cuando lleva cierto tiempo arrancado, veremos que el uso de memoria está normalmente entorno al 90-95%. Y eso no significa que andemos cortos de ella, sino que se está usando para cachear los accesos a disco. Pero esa caché puede descartarse en cualquier momento si cualquier proceso demanda más memoria.

      De hecho, el 5-10% restante se reserva, precisamente, para poder asignarla sin demora puesto que la caché de disco, aunque normalmente buena parte estará sincronizada y por lo tanto podrá ser descartada inmediatamente, "tomar nota" de que esos datos ya no están ahi, también toma tiempo que, por poco que sea, a nivel de paginación de memoria, no hay que despreciarlo.

      Ya sé que no has dicho que la swap no sea necesaria ;-), pero quiero remarcar que no es ninguna "chapuza" ni muchísimo menos.

      Sin ella nos veríamos abocados a desperdiciar enormemente la RAM de la que disponemos no sólo por disponer de menos para la caché de disco al no poder liberarse las páginas que no estan siendo usadas, sino porque nos obligaria a trabajar bastante por debajo de nuestra capacidad real dado que el consumo de memoria no es fácilmente predecible y, si llegáramos al 100% de uso de RAM, el sistema se veria obligado a matar procesos para liberarla (lo cual no es nada deseable, como hemos comentado antes). Así que tendriamos que trabajar con un cierto margen de RAM desperdiciada...

      Con la swap no solamente tenemos un margen mayor, sino que el sistema escala mucho mejor y nos daremos cuenta mucho antes de que eso ocurra...

      En primer lugar, porque, aunque superemos, en memoria de programas, el tamaño de la RAM real, no pasa nada porque se pasarán a swap los procesos menos activos. Es decir: Aumentará la paginación y ralentizará progresivamente el sistema, pero éste no se caerá ni se verá obligado a matar procesos indiscriminadamente.

      De hecho, antes de llegar a éste punto, ya habrémos notado una bajada del rendimiento por la falta de caché de disco (aunque ésta, ni siquiera llegado el punto de superar el tamaño de la RAM, no seria tan severa como si hubiéramos privado el sistema de swap).

      E incluso pasado éste punto, el nivel de usabilidad del sistema continuará siendo bastante aceptable al principio, aunque degenerará progresivamente a media que aumente la paginación (a consecuencia de más demanda de memoria). Pero el sistema raramente llegará al extremo de tener que matar procesos indiscriminadamente porque nosotros ya nos habremos percatado de una severa caída del rendimiento y, muy probablemente, habremos tomado medidas al respecto.

      • Curioso, andaba buscando una cosa y he vuelto a encontrar este artículo en el que comenté en abril. Ya ni me acordaba ni me enteré de las respuestas ni de lo de usar mi artículo :-/

        Aprovecho para comentar sólo dos cosillas. A Joanmi que cuando digo que la SWAP es un "parche" no lo digo de forma despectiva. Es una solución técnica al problema de no poder tener tanta memoria como los programas solicitan. En un mundo ideal podríamos dársela pero, como no es previsible que sea así, optamos por implementar este parche que funciona bien mientras la memoria que los programas solicitan no sea la cantidad de memoria que usan activamente. Ya que si llegamos a ese punto esta solución hace que el sistema sea inmanejable.

        A Joan, releyendo el artículo y tu respuesta supongo que tienes razón. Es decir, si abres los programas que usas habitualmente, compruebas que el sistema funciona bien (es decir, que para el patrón de uso de la memoria que hacen esos programas, el funcionamiento es aceptable) miras la cantidad de memoria usada, quitas lo consumido por buffers y caches y añades cierto % de margen; puedes tener una estimación de la memoria total que necesitas en el sistema.

        Yo hablaba más bien de lo difícil que es predecir cuanta RAM necesitas para tener un funcionamiento aceptable. Estos días estoy jugando con máquinas virtuales y patrones de uso de la memoria y la verdad es que definitivamente es prácticamente imposible.

    • Gracias. Pues sí la verdad. Está vez los comentarios están siendo muy enriquecedores.

  • Espero no molestar, pero me gustaría comentar algo:

    Cuando terminé de leer el interesante artículo, me di el animo de hacer los cambios que se describen respecto a "minimizar el uso de la memoria swap", pero luego también observé los comentarios y me dejaron un poco confundido en el tema ya que no entendí bien todo. Mis dudas son las siguientes: ¿A qué conclusión se puede llegar sobre la memoria swap, es muy necesaria o no lo es tanto?, y si es muy necesaria ¿Cuál es el valor de swappiness óptimo?

    Gracias por el buen artículo que ayuda a tener un mejor funcionamiento del PC.

    • Hola, Para nada molestas.

      Vistos la totalidad de comentarios creo que más que responder tus preguntas lo mejor que puedes hacer es probar distintos valores y ver cual es el que mejor te funciona.

      Lo que está claro también es que el acceso a todo lo que se almacena en la memoria swap es mucho más lento que si lo tenemos cacheado o si lo tenemos en la memoria RAM. Por lo tanto cuanto menos tengas que acceder a la memoria Swap entonces a priori todo te irá más fluido. Por lo tanto si vas sobrado de RAM yo minimizaría el uso de la Swap.

  • Gracias por el artículo y los comentarios.

    Como muchos otros no usaba swap, usaba zRam, que al comprimir en un cierto espacio de la Ram los datos, daba vidilla a mi escasa Ram de 1Gb.
    Pero, mi Ubuntu 12.04 LTS se me congelaba...

    Arranqué el portátil con gParted, vi que tenia una partición swap; como me gustaría (a veces) dejar en hibernación el sistema, la hice más grande. Luego, desde una terminal le dije al sistema que la utilizara.

    Bajé los swappines de 60 a 10. Con una terminal, y los comandos free -m y swapon -s, voy viendo como va la RAM. Como dice Joanmi el uso de la RAM está siempre muy alto. Con 6 pestañas de Chromium y con el Gestor de Actualizaciones funcionando, me está costando escribir el comentario, el disco duro no para de escribir (observo). Miro en la Terminal, tecleando swapon -s, y veo que se activa zRam y la partición swap no se utiliza todavía.

    El sistema me indica que para completar las actualizaciones debo reiniciar. Le digo que sí. El sistema se me queda congelado: el teclado y el cursor no funcionan. tampoco el ordenador no me deja acceder a las terminales con Ctrl+Alt+F1 o Ctrl+Alt+F2...(?)

    Odio tener que parar el portàtil con el botón On-Off.

    ¿Ha sido Chromium el culpable?

    • Hola Carlos. Chromium no es el culpable. Es una suma de factores que hace que te haya pasado esto:

      1- Con un 1GB de RAM mejor no usar Ubuntu 12.04. Mira lo que te consume ubuntu una vez arrancado el sistema.... Prácticamente te estará consumiendo la Giga de RAM que tiene tu ordenador. Ubuntu es la Distro de Linux que consume más recursos. Yo con tu ordenador no usaría Ubuntu.

      2- Chromium y Chrome consumen mucha RAM y cuantas más pestañas abras más RAM consumirán. Además cada extensión que poner al navegador consume tu RAM. Si solo hubieras abierta 1 o 2 pestañas quizás el ordenador no se hubiera colgado.

      3- Te fijarás ademas que cuando estás actualizado se acostumbra a realizar un uso de la CPU bastante alto (CPU que por la RAM que tienes será una CPU bastante antigua). ZRAM cuando trabaja también hará un uso de la CPU.... Y todo sumado hace que pase lo que pase.

      4- Además es probable que aparte de lo que comentas tuvieras otros programas corriendo de forma simultanea que ni te das cuenta como por ejemplo dropbox que consume mucha más RAM de lo que la gente piensa.

      Si llenas la giga de RAM Zram se volverá loco porqué no tendrá espacio. Además cuando Zram no pueda trabajar debería funcionar la Swap. Al menos en Debian puedes indicar la prioridad de actuación tanto de la Swap como de Zram (En ubuntu no se como se hace). En mi opinión deberías usar una disto acorde a tu ordenador y ser cuidadoso con los recursos que consumes. Conky puede ser una buena herramienta para controlar los recursos que usas. También puedes usar top o htop. Como creo que he escrito en los comentarios uso un notebook que tiene 1GB de RAM y con Xubuntu me sobra para el uso que le doy y para el uso que le daría la mayoría de la gente. Mi notebook para nada se congela ni va lento si se usa cuidadosamente.

      Por cierto aprovecho para comentar que Zram será incluido de forma estandard en el Kernel de Linux.

  • Tras leer el artículo y los comentarios, me surgen dudas sobre este sistema, ¿Por qué coge 1Gb de Swap, teniendo 4Gb libres de RAM?

    total used free shared buffers cached
    Mem: 12298668 8281508 4017160 0 278524 378040
    -/+ buffers/cache: 7624944 4673724
    Swap: 2097144 1048548 1048596

  • Hola Joan,

    Te he dedicado una entrada en mi blog jurídico/informático. Lo que pongo al final de la entrada, cuenta con ello. Me ha servido de mucho este tutorial.

    Un saludo

  • Saludos!! amigo Joan

    Me ha parecido genial el artículo. Lo he llevado a cabo sin problema alguno; sin embargo, quería consultar una cosa que he notado. Yo he llevado a cabo tanto la creación del script para liberar swap como se indica en el presente articulo, y también la creación del script correspondiente para ejecutar la liberación de memoria ram lo cual se explica en otro de tus artículos.

    Igualmente he llevado a cabo la creación del modulo Zram el cual se carga sin problemas al iniciar mi sistema. El punto es que cuando ejecuto el script para liberar swap (y hace lo que tiene que hacer) y luego verifico en la terminal con "swapon -s" si el módulo Zram esta cargado y ejecutándose y resulta que no esta, desaparece. Y me he dado cuenta que sucede cada vez que ejecuto el script antes mencionado. Si pudieras orientarme por favor sobre por qué puede que este ocurriendo esto. Gracias de antemano por la repuesta y ayuda.

    • Hola Buenas,

      Al limpiar la cache de la RAM es probable que también elimines la partición de Zram que tienes ubicada en tu memoria RAM. Si quieres una solución fácil y rápida puedes crear el módulo de Zram desde el script que te limpia la RAM. Así se limpiaras tu cache y a posteriori se creará de nuevo un módulo de Zram.

      • Buenas noches! amigo, primero que nada te agradezco nuevamente por atender a mi planteamiento.

        Ahora, y espero disculpes mi ignorancia al respecto (ya que aún soy novato en este tipo de cuestiones) pero ¿cómo hago lo que sugieres?:

        Lo he intentado agregando a dicho script las lineas/comandos correspondientes a la activación, creación, montaje y otorgación de prioridad para el módulo Zram así como el exit 0 al final; pero al ejecutar el script en la terminal me arroja el siguiente error:

        jeiler@JavGro:~$ sudo ./limpiamemoria.sh
        “Limpiando la caché~ “
        “Limpiando Swap~ “
        ./limpiamemoria.sh: línea 7: echo: error de escritura: Dispositivo o recurso ocupado

        Realmente no se si como estoy realizando el procedimiento es la manera correcta. El script luego de modificarlo a quedado de esta manera:

        #!/bin/bash
        echo “Limpiando la caché~ “;
        sync ; echo 3 > /proc/sys/vm/drop_caches
        echo “Limpiando Swap~ “;
        swapoff -a && swapon -a
        modprobe zram &&
        echo $((100*1024*1024)) > /sys/block/zram0/disksize &&
        mkswap /dev/zram0 &&
        swapon -p 50 /dev/zram0 &&
        exit 0

        • Prueba reiniciando el sistema, y después realiza todo paso a paso, cierra el script y actualiza con el siguiente comando:
          sudo apt update

  • ¿Por que la opción 3 al liberar la cache no afecta el rendimiento del servidor o el de las aplicaciones?

    Pregunto porqué por default el drop_caches tiene la opción 0.

    ¿Si se cambia por 1 , 2 , o 3 y se deja así trabajaría mejor la memoria y no seria necesario estar liberando? o esto afectaría al servidor o a las aplicaciones?

  • Un articulo realmente excelente, me ha gustado mucho. Me añado tu pagina a mis canales RSS para seguirte, un saludo.

    • Buenas Liher,

      Gracias por tus palabras. En tu blog también tienes artículos buenos. Un saludo.

  • Yo en particular uso el doble de la RAM como swap, e incluso un poco más que la RAM, ya que en ocasiones tengo que hibernar la máquina y para ello se requiere que toda esa memoria en RAM quede volcada a disco y una de las utilidades que tiene la swap es esa.

    Esto es un uso personal de la swap, cada quien administra la swap como más le guste. De todas formas como sugerencia pueden crear la swap al final del disco y darle alguna holgura de espacio inutilizado para luego agrandarla si requieren más. Un par de GB no son nada.

  • Hola Joan,

    muchas gracias por el artículo, genial, muy bien explicado.

    La consulta que te hago es respecto a que se considera memoria ram. La duda es la siguiente:

    Si tecleo el comando "free" me sale que tengo ocupada 1,6 de 1,8. Sin embargo, en el sistema monitor figura que solo estoy consumiendo 1 g de ram. El comando free incluye buffers, cache, almacenamiento, etc, y estos no se si se incluyen dentro de la ram.

    Mi consulta a todo esto es si debo modificar el valor del swapiness con 2 gigas o no (teniendo en cuenta lo que digo arriba, que no se exactamente el porcentaje de memoria que uso ja). Saludos, te seguiré molestando en otros post sobre zram que tengo dudas también.. Desde ya, muchas gracias!

    • Hola Walter.

      Sí el monitor te dice que consumes 1 GB entonces estás consumiendo realmente 1 GB.

      No obstante Linux usa prácticamente la totalidad de memoria RAM. La memoria RAM libre, que en tu caso será 1GB, linux la usará como cache o buffer con el fin de acelerar las lecturas y escrituras en disco. Por lo tanto siempre tendrás muy poca memoria RAM disponible.

      En el caso que estés usando 1GB y abras un programa que demande 700 MB de RAM, no te tines que preocupar. En el momento en que se necesita la memoria RAM se liberará de forma automática.

      Respecto a si es recomendable usar Zram te recomiendo que hagas tus pruebas y saques conclusiones. Ayudar puede que ayude, pero no esperes milagros.

      Saludos

  • Gracias, muy interesante, instructivo y resuelve muchas dudas pero en OpenSUSE Tumbleweed no se aplica, he realizado toda la configuración como root y me sigue apareciendo al reiniciar el valor 60 como uso de memoria.

    ¿Hay forma para hacerlo en OpenSUSE Tumbleweed?

    • Hola

      No soy usuario de Opensuse, pero por lo que he visto en foros de OpenSuse el procedimiento es el mismo que detallo. Por lo tanto en alguna parte te habrás colado.

      Saludos

  • Me gustan estos comentarios.

    Cada uno se da un "derechazo" "izquierdazo" luego se dan la mano en fe de amistad y para finalizar se dan un abrazo y un gracias.

    Caballeros lujo de comentarios !

  • El artículo me ha parecido muy interesante al igual que los comentarios.

    En mi caso quiero tener el sistema operativo en un disco externo SSD y usarlo en diferentes ordenadores con muy diferentes memorias Ram.

    La verdad es que no tenía ni idea de que swap poner hasta leer el articulo.

    La idea que me llevo es tener un swap suficientemente grande para el mayor de ellos y ajustar el parámetro swappiness en función de la memoria ram del ordenador en el que se arranca.
    sudo sysctl -w vm.swappiness=f(ram,swap)

    La cuestión sigue siendo la misma, la relación entre ram, swap y swappiness y supongo que la respuesta sigue siendo "prueba y error" pero ahora tengo un punto de partida.

    • Hola

      Si los equipos son muy distintos entre si en lo que a hardware ser refiere puede que hayan equipos que no arranquen o no funcionen como es debido. O si te funciona lo más adecuado quizás sea dejar la configuración estándar que se supone que es la que mejor funcionará en la mayoría de equipos.

      Saludos

Artículos Relacionados