martes, 17 de junio de 2008

Memoria de linux llena sin motivo

Un susto que me he llevado pero que no es problema:
En un servidor linux con 1gb de ram es normal que se llene la memoria?

Por lo visto la ram si no tiene nada más importante en que ocuparse se encarga de guardarse en caché peticiones que se hagan al servidor con lo cual es posible que un servidor con muy pocas peticiones llene su memoria.
Cuando necesite memoria para otras cosas más importantes que cachear borrará caché sobrante.

Pego artículo de Ernesto Perez:

La memoria RAM del servidor se llena

Pues uno de los síntomas típicos de ram llena es que el servidor no logra abrir las sesiones completamente

Normalmente la memoria no se llena de repente, sino que se va notando que el servidor se va llenando.

Podemos monitorear la memoria RAM mediante el comando “free”, por ejemplo:

free -m
total used free shared buffers cached
Mem: 995 970 24 0 63 721
-/+ buffers/cache: 185 809
Swap: 1999 101 1898

¿Qué nos está indicando este comando? Para empezar, por mi parte no considero que tengo problemas con la memoria, veo que a simple vista está todo bien. Pero veamos los detalles:

El servidor tiene 1GB de Ram (reporta 995 pero está bien). De los cuales está usando 970 MB de memoria y tiene 24 libres (no es para asustarse, esperen!).

Estos 970 se pueden desglosar aproximadamente en:

* 63 MB buffers - son memorias de intercambio, que no son permanentes ni obligatorias tenerlas siempre

* 721MB cacheados - son páginas tomadas en algún momento del disco para ser servidas y que por su nivel de acceso el servidor ha decidido guardarlas en memoria para tener más rápido acceso, definitivamente es mejor acceder a la memoria RAM que no a disco; estas páginas pueden ser descartadas, desechadas en cualquier momento, no indican que la memoria está llena sino que el servidor como tiene memoria libre, ha ido viendo las páginas más solicitadas y las ha mantenido en memoria. Eso es buen síntoma.

* 185 de memoria core: Digámosle así, porque no tengo un nombre exacto. (eso de -/+ buffers/cache no me gusta). Esto indica cuál es la memoria que realmente el sistema está usando, tanto para el kernel como para los procesos que están corriendo e indica que es una memoria bloqueada que no puede ser descartada (como sí puede ser el buffer y el caché). Es decir, si esta memoria se acerta al total (995 en mi caso) preocupémonos!!! pues significa que el servidor en cualquier momento se queda sin memoria para asignarle a los procesos.

De swap, tengo 2 GIGAS (normalmente pongo la misma swap que ram, pero en este caso de prueba puse el doble). Y estamos usando 101 megas, no es nada de alarmarse sobre todo que es un momento bien popular para el servidor y hace que tenga algunos procesos que pueda swapear para tener un poco más de memoria core y para cache y demás.

En definitiva. No estamos usando más que 185 megas en RAM de 1GB que tenemos y 101 megas en swap de 2GB, no creemos que el problema sea por memoria llena.

Además hemos implementado un script que chequea cada un minuto la memoria y lo guarda a un archivo, así que cuando el servidor se cae y lo levantamos, verificamos el uso de memoria al momento de la caída, y definitivamente es super normal en ese momento.


Aquí el script:

#!/bin/bash
echo "`date "+%d-%H:%M.%S"`" >> /var/log/memoria .log
/usr/bin/top -bn1 >> /var/log/memoria .log
uptime >> /var/log/memoria .log
cat /proc/meminfo >> /var/log/memoria .log
ps fuaxww >> /var/log/memoria.log
netstat -na >> /var/log/memoria.log

Lo que hace es bien simple, lo ponemos en el crontab cada unos 2 minutos (o un minuto o 3, como deseen) y el scriptcito guardará en /var/log/memoria.log una serie de detalles como procesos corriendo, memoria en uso, tiempo al aire y procesos de red.

No hay comentarios: