jueves, 25 de abril de 2013

Mejora el rendimiento con Zram, la swap en ram


El swap es un tipo de memoria especial en disco que se utiliza para mover datos de la ram que no se están utilizando en ese momento, cuando nos hace falta más memoria ram de la que realmente tenemos disponible. Su problema, es que el disco es infinitamente más lento que la ram, lo que hace que leer o escribir los datos del swap sea lento y apreciemos ralentización en el equipo.


Una buena forma de mejorar esto es crear esta memoria especial swap en la propia memoria ram, utilizando zram.


Seguramente estarás pensando que estoy loco. Crear una memoria en la ram cuyo fin es meter datos que no caben en la ram,  así contado, no tiene sentido. Pero es que lo que nos falta por decir es que zram comprime los datos al meterlos en su área de memoria swap, por lo que realmente tenemos más capacidad de memoria sin el ralentizamiento de escribir en disco.

Esto es útil en equipos con pocos recursos, pero también en equipos con discos SSD, puesto que alarga su vida al realizar menos operaciones de lectura y escritura en ellos.

Para activarla, lo primero que vamos ha hacer es abrir una terminal como root, o si la abrirnos como usuario normal, convertirnos en root con el comando su. Este es uno de los pocos casos que he visto en los que sudo no nos dará los permisos suficientes para hacer lo que deseamos.

Primero comprobaremos si nuestro kernel soporta el modulo de zram. En mi caso, con Wheezy no hay problema alguno.
  • grep -i zram /boot/config-`uname -r`

El resultado será algo como esto
CONFIG_ZRAM=
# CONFIG_ZRAM_DEBUG is not set
Esa “m” nos indica que zram es soportada como un modulo externo al kernel, así que vamos a cargarlo.
  • modprobe zram

Ahora vamos a crear el dispositivo zram, vamos a asignarle 100 megas, pero tu puedes asignar más o menos memoria según tu gusto cambiándolo por el 100 que yo pongo en el comando
  • echo $((100*1048576)) > /sys/block/zram0/disksize

Montamos el dispositivo
  • mkswap /dev/zram0

Y le asignamos prioridad, que debe ser mayor que la de la swap en disco, para que se use preferentemente nuestra zram. Con una prioridad 10 bastará
  • swapon -p 10 /dev/zram0

Y ya lo tenemos funcionando. Pero claro, lo que nos interesa es que funcione siempre cuando iniciamos el ordenador, sin tener que dar todos estos pasos cada vez. Para ello vamos a editar el fichero /etc/rc.local con nuestro editor favorito. Yo utilizaré pluma, pero puede ser cualquier otro, por ejemplo, gedit o nano
  • pluma /etc/rc.local

Y pegamos estas lineas antes de donde pone exit 0
modprobe zram &&
echo $((100*1048576)) > /sys/block/zram0/disksize
mkswap /dev/zram0 &&
swapon -p 10 /dev/zram0 &&
Guardamos los cambios y listo, ya tenemos zram funcionando y nuestro equipo más contento.

18 comentarios:

  1. «Seguramente estarás pensando que estoy loco. Crear una memoria en la ram cuyo fin es meter datos que no caben en la ram, así contado, no tiene sentido. Pero es que lo que nos falta por decir es que zram comprime los datos al meterlos en su área de memoria swap, por lo que realmente tenemos más capacidad de memoria sin el ralentizamiento de escribir en disco.»

    Ahora lo entiendo.

    «Esto es útil en equipos con pocos recursos, pero también en equipos con discos SSD, puesto que alarga su vida al realizar menos operaciones de lectura y escritura en ellos.»

    Ahora le veo la utilidad: tengo un par de ultraportátiles com unidades SSD muy reducidas (4 GB uno; 16 GB el otro). Lo que pasa es que tampoco van sobrados de RAM (512 MB y 2 GB respectivamente). De cualquier forma, es muy interesante, tengo que estudiarlo.

    ¿Afectaría de alguna manera a la suspensión a RAM? En principio, como quedaria menos RAM disponible, podría quedase demasiado corta... ¿Y a la hibernación? La hibernación se hace sobre la swap, ¿no? ¿Se puede seguir hibernando? ("Se acerca el inverno..." ;-) )

    ResponderEliminar
    Respuestas
    1. La suspensión no debería afectar, la hibernacion no se si realmente se hace a la swap o no.

      Eliminar
  2. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
    Respuestas
    1. Ni idea, mis conocimientos no alcanzan para tocar el kernel

      Eliminar
  3. Pues vamos a ello que ultimamente como que ando medio tieso de ram.

    ResponderEliminar
  4. ¿Recomendarías algún porcentaje de la ram para asignarle? Hablas de 100 o al gusto, pero supongo que habrá unos valores más razonables que otros. La swap que ya tengo...¿ya no hace falta? ¿Puedo eliminarla o reducirla? Gracias por el excelente artículo.

    ResponderEliminar
    Respuestas
    1. La swap en disco sigue siendo necesaria, por si te quedas sin memoria.
      ¿La cantidad de swap en ram ideal? Pues, sinceramente no lo se.

      Eliminar
  5. Me aparece este error al acabar de hacer todo:
    Erro do MateConf: Failed to contact configuration server; some possible causes are that you need to enable TCP/IP networking for MateCORBA, or you have stale NFS locks due to a system crash. See http://wiki.mate-desktop.org/docs:mate-conf for information. (Details - 1: Se produjo un fallo al obtener la conexión con la sesión: La conexión está cerrada)

    ResponderEliminar
  6. ola ke ase vruto! tu blog me encanta, es muy útil.
    Aun así hay algo que no me cuadra: tras haber hecho esto, (aún no he hecho reinicio) el sistema me sigue detectando mis 3 gigas de ram pero me detecta mas swap. Me salió el siguiente fallo en el momento de montar:

    root@GabrielPC:/home/gabriel# modprobe zram
    root@GabrielPC:/home/gabriel# echo $((2867*1048576)) > /sys/block/zram0/disksize
    root@GabrielPC:/home/gabriel# mkswap /dev/zram0
    Setting up swapspace version 1, size = 2935804 KiB
    no label, UUID=a99ebdf6-1960-40d9-8986-f7e9152cbbc2
    root@GabrielPC:/home/gabriel# mkswap /dev/zram0
    Setting up swapspace version 1, size = 2935804 KiB
    no label, UUID=cd77f090-540b-4179-96a1-6897e1368301
    root@GabrielPC:/home/gabriel# swapon -p 10 /dev/zram0
    root@GabrielPC:/home/gabriel#


    ResponderEliminar
  7. Este post es copiado. Pon la fuente en la que te has basado para escribirlo.

    ResponderEliminar
    Respuestas
    1. No esta copiado, he leído unos cuantos artículos para conocer el tema y luego he hecho este contando como lo he hecho en mi equipo.

      Por favor, si consideras que es copiado, dime de donde.

      Eliminar
    2. Por favor intenta recordar las fuentes que elegiste y ponlas al final del post. Las fuentes que usaste estarán agradecidas

      Eliminar
    3. El primer sitio donde lo vi fue aquí

      http://www.meneame.net/story/zram-como-usarlo-cualquier-sistema-operativo-gnu-linux

      Así que me fui al enlace original

      http://geekland.hol.es/optimizar-el-rendimiento-con-zram/

      Trate de comprender un poco mas como funciona mirando la wikipedia

      Luego encontré referencias para Ubuntu, pero no me atreví a meter PPAs

      http://www.webupd8.org/2011/10/increased-performance-in-linux-with.html

      Y revise algún otro resultado de Google, como este

      http://www.alcancelibre.org/article.php/aldos-zram

      Eliminar
  8. Ok gracias. El tema me ha parecido interesante y la verdad es que me gusta leer las fuentes originales. Un saludo

    ResponderEliminar
    Respuestas
    1. A mi al final me ha decepcionado un poco. Supongo que a mi ordenador ya no se le puede sacar mas.

      Eliminar
  9. Hola ,
    puedes ahorrarte una linea en el script haciendo lo siguente en la linea de swapon:
    modprobe zram &&
    echo $((100*1048576)) > /sys/block/zram0/disksize
    swapon -f -p 10 /dev/zram0 &&

    Como todo el mundo pregunta que tamaño de zram es mejor: Entre el 33% y el 66% de la memoria instalada, con 50% estaría bien.

    ResponderEliminar

prekes sodui