18 jun 2012

Limpiar memoria RAM en Linux en solo unos comandos

A diferencia de Windows, donde se debe recurrir a programas para limpiar la RAM, es decir, luego de, 1 dia de un Windows iniciado, notamos que por mas que cerremos todo, la RAM no esta como iniciamos, sino un poco mas abultada.
Generalmente esos programas rompen cosas y provocan perdida de datos, o no funcionan, pero en Linux, si, y excelentemente. Además, no es un programa!, sino una funcion de kernel Linux.

Por defecto, la cache de RAM, la maneja el kernel, y no es necesario tocarla, pero si sos muy obsesivo y paranoico, como yo, te gustará ver la RAM, identica a como iniciaste el sistema, aun despues de haber tenido la PC prendida 1 dia o mas.

A partir del kernel 2.6.16 se introdujo esta caracteristica de la que hablaremos ahora.

La caché RAM, son "cosas" que quedan ahi, por si se necesitan luego, ejemplos de programas que generan que esto se "llene" son:

Chrome
Firefox
VirtualBox
Pidgin
Gimp
Apache

En el directorio /proc/sys/vm/ tenemos un fichero llamado drop_caches, que se encarga de decirle al kernel Linux que hacer con las caches RAM.

A veces, no solo es util en tu PC, sino en servidores, en ocasiones, el uso de java en Apache, consultas, etc, genera que la RAM se llene y no se vacie, si tenemos un pequeño server de 512 de RAM o menos, esto, nos va a salvar tener que reiniciar algun servicio o el server.

Primero que nada, voy a explicar los valores existentes y su definicion.

0: No libera nada, lo controla el kernel (asi viene por defecto al iniciar el sistema)
1: Libera la pagecache
2: Libera inodos y dentries
3: Libera inodos, pagecache y dentries (todo en uno)


Definicion:

pagecache: Memoria caché de la paginación.

dentries: (Directory Entries) Representa la relación de forma estructurada que existe entre directorios-archivos.

inodes: Son nodos índice de archivos y directorios que usa el Sistema de Archivos para administrar las actividades posibles de dichos archivos y directorios guardados en disco o memoria. Contiene la metadata de los archivos y directorios: permisos, tamaño, propietario, última fecha de acceso, creación, modificación, etc.

Ahora bien, hay dos formas de hacer esto, mediante sysctl o mediante un simple echo, la forma politicamente correcta, seria sysctl, la corta y facil, igual de efectiva y no dañina, es echo.

Antes de hacer esto, se recomienda usar el comando sync, para los que no saben, man sync, pero basicamente vuelca al disco todos los cambios que andan rondando en RAM, dado que Linux es un sistema asincrono, en lo que discos respecta, a menos que montemos las particiones de forma sincronica en /etc/fstab, cosa que reduce el rendimiento, sobre todo en Ext4.

Nos logueamos como root y hacemos:

#sync
#echo "0" > /proc/sys/vm/drop_caches
#sync
#echo "1" > /proc/sys/vm/drop_caches
#sync
#echo "2" > /proc/sys/vm/drop_caches
#sync
#echo "3" > /proc/sys/vm/drop_caches

Si leyeron bien, se habrán dado cuenta, que con la 3 hacemos todo, ok?.
La forma correcta, es con:

#sync
#sysctl vm.drop_caches=3

Ahora, si quieren, antes de seguir, hagan la prueba, inicien su PC, miren en htop la RAM consumida y anoten el valor, luego, abran Chrome, Firefox, miren un video en youtube, etc. Cierren todo y miren la RAM, veran un incremento. Ahora, abran un terminal, como root pongan:

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

Vuelvan a mirar la RAM en htop, cambio no?.

Ahora, simplifiquemos esto, como?, un script, ponerlo en .bashrc me parece un exceso, ademas deberiamos abrir una terminal, lo mismo si lo ponemos en cron, es un exceso, asi que, creamos un script, de la siguiente forma.

Se loguean como root y:

nano /usr/local/bin/freeram (asi le pongo yo, ustedes le ponen como quieren, pepe, luis, liberaram)

y el contenido será:

#!/bin/sh
# Author: SynFLag
# Licence: GNU GPLv3
# Freeram is a script to clean the RAM caches
sync ; echo 3 > /proc/sys/vm/drop_caches ; echo "RAM Liberada"

exit 0

Salvan con ctrl+o y salen con crtl+x, luego, como root nuevamente:

chmod +x /usr/local/bin/freeram

Ahora, desde cualquier terminal, ponen:

$ sudo freeram (dado que necesita permisos de root), y listo, liberan la ram cuando desean o para los que no usan sudo, como yo
$ su -c "freeram"

Esto aplica a cualquier distro Linux con kernel 2.6.16 o superior.

20 comentarios:

Anónimo dijo...

Con tu permiso, me lo quedo. Muchas gracias.

SynFlag dijo...

Claro que si, si lo vas a publicar, cita la fuente, si quiere un script, te paso el que yo uso:

#!/bin/sh
# Author: SynFLag
# Licence: GNU GPLv3
# Freeram is a script to clean the RAM caches
sync ; echo 3 > /proc/sys/vm/drop_caches ; echo "RAM Liberada"
exit 0

Unknown dijo...

pues yo ya lo ocupo jejejeje gracias por aportar

Anónimo dijo...

Muchas gracias, muy bueno !!

Anónimo dijo...

Muy bueno!!! Se podrá hacer que el script se active solo cada cierto tiempo, por ejemplo cada una hora??
Muchas gracias!
Mauro.

SynFlag dijo...

De nada!

SynFlag dijo...

Claro que si, agregandolo a crond.

http://docs.fedoraproject.org/en-US/Fedora/14/html/Deployment_Guide/ch-Automated_Tasks.html

Anónimo dijo...

Hola! gracias por el aporte! oye tengo una pregunta... ¿Es correcto liberar memoria mientras se ejecuta un programa? ¿afecta en algo? Bueno mi pregunta más específica... si estoy ejecutando un programa en C, ¿puedo liberar la memoria RAM sin afectar en algo la ejecución de este? Disculpa si mi pregunta se te llega a hacer tonta.

Gracias!

SynFlag dijo...

Hola, mira, de hecho lo que vacias con eso, son los cache ram, los paginados. En realidad no afecta en nada, dado que el kernel Linux manenja eso, es decir, su scheduler, I/O controller y demás hacen que una cosa no afecte a la otra. Si lo afecta, entonces reporta un bug a kernel.org, porque no deberia afectarlo para nada y pasaría a ser un fallo no previsto, o sea, bug.

Anónimo dijo...

Gracias

Anónimo dijo...

Muchas gracias! lo intentaré porque si me interesa hacerlo, :) gracias por responder, saludos!!

SynFlag dijo...

De nada, siempre respondo las preguntas!

SynFlag dijo...

De nada

Anónimo dijo...

Una pregunta si le mandas un echo con 3 y lo dejas tal y como esta no se quedaría con el valor 3? es decir no habría despues que volver al valor 0 para que vuelva a gestionar la memoria el s.o?

SynFlag dijo...

No es necesario volverlo a 0, dado que si notas, si no volves a ejecutar echo 3 las caches no se vacian solas.
De hecho esta documentado asi:

https://www.kernel.org/doc/Documentation/sysctl/vm.txt
drop_caches

Writing to this will cause the kernel to drop clean caches, dentries and
inodes from memory, causing that memory to become free.

To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches

As this is a non-destructive operation and dirty objects are not freeable, the
user should run `sync' first.

Si queres verlo de un modo mas ortodoxo, si, podés agregar una linea que sea echo 3 > /proc/sys/vm/drop_caches

Anónimo dijo...

Muchas Gracias.

Anónimo dijo...

Intenté hacer el script, pero no me funcionó:

[root@Tebow alan]# nano /usr/local/bin/freeram
bash: nano: command not found...

Que estaré haciendo mal, soy nuevo en linux. Uso fedora 17

SynFlag dijo...

No tienes instalado nano, entonces:

# yum install nano

Stivenson Rincon Mora dijo...

Gracias. Buen aporte. Ya estaba cansando de reiniciar mi equipo cada vez que quería liberar memoria.

SynFlag dijo...

Si, es muy util.