Saturacion de memória RAM

Mauricio José Adonis Carrasco mike.alfa.2007 en gmail.com
Mie Mayo 14 13:40:30 BST 2008


El mar, 13-05-2008 a las 16:49 -0300, Marcos Ivan Gritti escribió:
> 
>   
> 
> 
> Hola Amigos:
> 
> Que tal?. le comento que tengo instalado en mi equipo Ubuntu 7.10
> ( Gutsy Gibbon ) para 32bit. Hace un tiempo que vengo teniendo
> problemas, ya que en cualquier instante mi pc se "tilda" ( se que
> suena casi un pecado, pero asi es). y cuando veo el uso de RAM
> (mediante un monitor en la barra de tareas) esta está saturada (tengo
> 1 GB y muestra uso de 948MB).
> Cuando esto sucede no tengo ninguna aplicación pesada abierta, solo
> Firefox ( con 3 pestañas abiertas ), Evolucion y alguna que otra
> aplicacion.
> Mi PC es una AMD 64 x2 Dual Core 3600+, 1 GB RAM, placa de video
> GeForce 8600GS de 512Mb y disco de 350GB.
> Tengo habilitado Emerald y CompizFusion.
> Si alguien puede darme una solucion, le agradeceria con el corazón.
> Si necesitan mas datos, por favor diganme y tratare de obtenerlos.
> 
> Agregado: mi Swap es de 2GB. Inició en 1GB, la aumente para ver si era
> la solución, pero nada :S
> 
> 
> Muchas Gracias
> 
> 
> 
Hola Marcos, en primerísimo lugar me podría decir que se entiende por
tildar? Recién, recién yo había hecho una consulta similar sobre la
memoria a la lista y otras partes también, recibí muchos comentarios que
me aclararon cosas importantes con relación a cómo se usa la memoria en
Linux, te los voy a pegar para que veas si te sirven para entender qué
pasa y si está relacionado con tu memoria... mi consulta era sobre cómo
liberar memoria en GNU/Linux, pues yo pensaba que estaba siendo saturada
por el sistema... he aquí algunas respuestas:

1) Lo primero debes de diferenciar entre memoria residente o
"cacheada"(termino de mi cosecha). Si haces un free en consola lo podrás
 ver. La gestion de la memoria la hace el kernel y me creo que tu no
puedes hacer nada. Lo ideal es tener la memoria 100% usada.Ahora bien,
si es usada 100% como residente en tu uso habitual, significa que
necesitas comprarte un modulo más de memoria ya que los programas que
utilizas te lo comen todo con su uso minimo. SI la memoria está
cacheada. No te preocupare porque el sistema ya se encargará de
liberarla cuando nuevos procesos la pidan, digamos que es memoria usada
para mejorar la eficiencia pero que el sistema la cachesin que sea
necesario, mientras tanto no deberiás preocuparte.

Tal y como te han dicho, la memoria libre en linux se usa como cache
de bloques, de manera que cada vez que quieres leer un bloque del
disco duro, se lleva a memoria, para que la siguiente vez que leas,
leas (o escribas) en memoria, piensa que es muchisimo mas de 1000
veces mas rapido leer desde memoria que desde disco), otro uso que se
le da es como buffers, por ejemplo, quieres copiar un archivo a un
pendrive, lo arrastras ( o haces cp, o lo que sea) sobre el pendrive,
y no se escribe inmediatamente, sino que se va escribiendo conforme el
sistema encuentra recursos libre, como por ejemplo, que no estes
leyendo en ese momento sobre el pendrive), tambien se usa como cache
de inodos y directorios, que hace que acceder repetidas veces a la
misma ruta sea muchisimo mas rapido que leer la ruta desde el disco.

2) Fíjate en la cifra de la derecha:

top-21:28:32 up 1 day, 16:08, 40 users,  load average: 0.53, 0.64, 0.62
Tasks: 241 total,   2 running, 239 sleeping,   0 stopped,   0 zombie
Cpu(s): 21.2%us,  4.0%sy,  0.0%ni, 74.8%id,  0.0%wa,  0.0%hi,  0.0%si,
0.0%st
Mem:   1036364k total,  1020256k used,    16108k free,    23292k buffers
Swap: 12594880k total,   260100k used, 12334780k free,   400992k cached

·························································===============
 
Tengo "sólo" un giga, y casi la mitad está ocupado en caché, y 260 megas
en la swap. Tu tendrás mas en caché y buffers, y eso es memoria bien 
utilizada. Cuando más memoria tengas ahí, más rápido será el equipo.
El kernel considera que la memoria libre es inutil, por tanto la utiliza
toda y sólo deja una mínima parte para el dia a dia (segundo a segundo,
más bien). Esta manera de ser es contraria a la que usa el windows, y
por tanto choca y parece que hay algo mal cuando no es así.

3) Básicamente, el kernel cachea en memoria todo lo que puede
(generalmente son libs compartidas). ¿Por qué hace esto? Muy sencillo,
lo hace porque los discos duros son un cuello de botella atroz (es la
parte de la informática que menos ha avanzado en toda la historia de la
informática).

Si tienes las libs en memoria, cuando arranques una aplicación que
utiliza esa 
lib, cargará más deprisa ya que esa lib ya está en memoria.
Los buffers son memorias intermedias en las que se almacenan datos que
vienen de un dispositivo y van a otro dispositivo. Por ejemplo, cuando
te descargas algo de Inet, los datos no van directamente de la tarjeta
de red al disco duro* sino que pasan primero a un buffer, cuando se
llena el buffer ... se copian los datos a disco.

Esto se hace porque:

        - (por norma general) todos los datos que circulan por un
          ordenador TIENEN que pasar por CPU y RAM (a menos que se
          use (R)DMA)

        - cada dispositivo funciona de una manera aka lee y escribe
          una cantidad de datos determinada

        - cada aplicación lee y escribe una determinada cantidad
          de datos

        - cada sistema de ficheros lee y escribe una determinada
cantidad de datos

La mala noticia es que ese tamaño de datos de cada dispositivo,
aplicación, sistema de ficheros, ... es distinto, por eso el rendimiento
de un sistema informático es malo. ¿Se puede llegar a estandarizar? No
poruqe por ejemplo una BBDD generalmente tendrá muchos IOPS pequeños
mientras que una aplicación multimedia tendrá menos IOPS, pero
escribe/lee datos en bloques muy grandes.

Es decir, hace falta un almacén temporal de datos. Básicamente, un
ordenador funciona como UPS o FedEx o DHL o SEUR o cualquiera de esas
compañías: llega un paquete, lo almacenan temporalmente en un hangar y
cuando tienen XXX número de paquetes que van a al mismo destino ... los
envían. El hangar sería el buffer.

Como ves, realmente no es malo que se consuma toda la RAM. Sí es malo
que una aplicación tenga "memory leaks", es decir, que no gestione bien
el uso que hace de la memoria. Para eso tenemos debuggers y profilers
y ... los ojos para revisar el código fuente ;)

En /proc hay parámetros que puedes cambiar para que el kernel deje más o
menos memoria libre. Si mal no recuerdo, creo que hay un 10% (si alguien
tiene el número exacto que lo digo 0:) del kernel que NUNCA se usa, es
una medida de emergencia por si el sistema está muy cargado. Tienes ese
10% para (por ejemplo) poder entrar como root y ponerte a matar
procesos.

De todas maneras, la mejor solución al consumo de RAM es ... comprar más
RAM ;)

Otra opción es echar mano de profilers y debuggers y aportar parches al 
kernel, a las aplicaciones que consumen mucha RAM, a gcc, ...

4) En linux se aprovecha toda la memoria para algo. La memoria libre
es 
inutil, no se está aprovechando. La que no se esté usando en algún 
programa se usa en cache de disco.

Programas para ver el reparto de memoria hay unos cuantos.

Esta respuestas quizás aporten a tu problema.

Saludos.




Más información sobre la lista de distribución ubuntu-es