Optimizando el Sistema Linux – Memoria Virtual 2

By | 0 Comments

  Seguimos con el tema de la memoria, si os acordáis, comenté en el post anterior que nos íbamos a encargar de dejar la memoria bien limpia. Lo que vamos a hacer es vaciar caches, etc, usando un parámetro dentro de /proc, como ya venimos haciendo en esta serie de posts. En concreto nos vamos a centrar en el archivo /proc/sys/vm/drop_caches, creo que el nombre lo dice todo.

  Vamos a ver que nos cuenta la documentación sobre este fichero, ya sabéis que todos estos ficheros están explicados en la documentación de “kernel.org”, que es donde miro yo, y todo el mundo en general. A este fichero le podemos setear una serie de valores, si lo ponemos a 1 se va a liberar la “page cache”, que viene a ser la cache de disco (I/O). Ya hablaba en el post anterior, de que las operaciones de entrada o salida siempre van a tener entremedio un buffer o cache en memoria. Al acceder a un archivo, se va a utilizar esa cache para almacenarlo, para que en un futuro si necesitamos volver a acceder al mismo fichero, no tengamos que volver a “molestar” al disco. Lo mismo a la hora de escribir en disco, que ya estuvimos hablando largo y tendido, de como controlarlo.

  Al final vamos a acumular gigas de datos cacheados, cuantas mas operaciones de I/O hagamos pues más, echad un vistazo en /proc/meminfo. Eso es lo que se va a liberar cuando seteamos el valor 1, y lo podemos hacer de esta forma.

# echo 1 > /proc/sys/vm/drop_caches

  Le podemos dar el valor 2, en este caso liberará la páginas y objetos que tiene marcados como candidatos a ser liberados, también hablaba sobre esto en el otro post. Son páginas de memoria inactivas y otros objetos que no viene al caso entrar en más detalle. Para setear el valor.

# echo 2 > /proc/sys/vm/drop_caches

  Y por último si le ponemos el valor 3, pues va a liberar ambas, tanto el 1 como el 2. Yo es lo que hago, marcar como libre toda la memoria que se pueda, pero antes se recomienda usar el comando sync. ¿ Por qué ? Este comando lo que va ha hacer es sincronizar los “archivos sucios” que tenemos en memoria con el disco, con el fin de conseguir mas páginas de memoria y objetos candidatos a ser liberados. Estos conceptos están explicados en el otro post, recomiendo que lo leáis, por algo este es la segunda parte. Ya que si recordáis, esto es lo que pasaba cuando llegábamos al límite de memoria que teníamos en el “dirty_ratio”, se forzaba una sincronización, cosa que nunca queríamos ya que bloqueaba la escritura de otros procesos.

  Afortunadamente, no es lo mismo que nosotros llamemos a “sync”, a que lo haga el kernel en el caso anterior. Así que lo haremos de esta manera.

# sync && echo 3 > /proc/sys/vm/drop_caches

  Antes de ejecutarlo echad un vistazo al estado de la memoria y caches desde /proc/meminfo o con “top”, para ver el cambio. Por ejemplo desde top se vería este cambio.

ANTES

cache antes

DESPUÉS

cache después

  También hay que decir que si no lo liberamos nosotros el kernel lo va ha hacer en caso de que lo necesite, pero yo prefiero liberar lo máximo que se pueda, y que el kernel disponga de esa memoria como libre, que siempre le facilitará los cálculos. Ejecutar el comando nos sirve para una vez, pero ya que nos hemos puesto, habrá que hacer que se libere la memoria de una forma regular. Y para esto tenemos al demonio cron , que supongo que sabréis lo que es, vamos a ponerle la entrada con el comando (como root).

# crontab -e

  Y le añadimos la línea.

0 * * * * sync && echo 3 > /proc/sys/vm/drop_caches

  Guardamos, y con esto ya le decimos que cada hora ejecute el comando. Yo he estimado oportuno ejecutarlo cada hora, podéis modificarlo como queráis. Lo único malo que tiene liberar las caches es que si por ejemplo volvemos a acceder a un fichero que ya teníamos cacheado, va a volver a leerlo del disco, pero yo considero que una hora es un margen razonable. No es que vayamos a notar una mejoría muy notable, ya que el kernel trabaja bien con la memoria cacheada a al hora de liberarla cuando se necesite, pero algo ayuda.

  Saludos.