2011-03-28 13 views
14

Estoy recibiendo una discrepancia de uso de memoria entre meminfo y ps. Free informa que tiene mucha menos memoria libre que los procesos que aparentemente usan según ps.Linux discrepancia de informes de memoria

Según libre, sólo tengo 3188mb libre:

free -m 
      total  used  free  shared buffers  cached 
Mem:   15360  13273  2086   0   79  1022 
-/+ buffers/cache:  12171  3188 
Swap:   0   0   0 

trato de rastrear donde la memoria se va usando ps (cortado con tijeras debajo de los valores no 0 RSS):

ps -A --sort -rss -o comm,pmem,rss 

COMMAND   %MEM RSS 
mysqld   13.1 2062272 
java    6.2 978072 
ruby    0.7 114248 
ruby    0.7 114144 
squid   0.1 30716 
ruby    0.0 11868 
apache2   0.0 10132 
apache2   0.0 9092 
apache2   0.0 8504 
PassengerHelper 0.0 5784 
sshd    0.0 3008 
apache2   0.0 2420 
apache2   0.0 2228 
bash    0.0 2120 
sshd    0.0 1708 
rsyslogd   0.0 1164 
PassengerLoggin 0.0 880 
ps    0.0 844 
dbus-daemon  0.0 736 
sshd    0.0 736 
ntpd    0.0 664 
squid   0.0 584 
cron    0.0 532 
ntpd    0.0 512 
exim4   0.0 504 
nrpe    0.0 496 
PassengerWatchd 0.0 416 
dhclient3  0.0 344 
mysqld_safe  0.0 316 
unlinkd   0.0 284 
logger   0.0 252 
init    0.0 200 
getty   0.0 120 

Sin embargo , esto no tiene sentido ya que al sumar la columna RSS se obtiene un uso de memoria total de solo alrededor de 3287mb que debería dejar casi 12gb gratis.

Estoy usando kernel 2.6.16.33-xenU # 2 SMP x86_64 en Amazon AWS.

¿A dónde va mi memoria? ¿Alguien puede arrojar algo de luz sobre cómo rastrear esto?

+5

http://www.linuxatemyram.com/ – Erik

+0

Esto probablemente también sería más adecuado para unix.stackexchange.com. Buena pregunta, y un comentario bastante intrigante (si no breve) de Erik.Además, me acabo de dar cuenta de que en mi sistema Fedora, mientras que la parte superior informa que solo hay 4GB disponibles, el comando free -m (del enlace de Erik) reporta alrededor de 7GB gratis. gnome-system-monitor también representa el almacenamiento en caché del disco. –

+6

Este no es el mismo problema que linuxatemyram.com. Tenga en cuenta que estoy citando 3188mb gratis, que es correcto desde la columna libre de buffers/caché. –

Respuesta

21

comprobar el uso de la caché de la losa (Slab:, SReclaimable: y SUnreclaim: en /proc/meminfo). Este es un caché de estructuras de datos en el núcleo, y está separado del caché de página informado por free.

Si la caché de losa es responsable de una gran parte de su "memoria faltante", consulte /proc/slabinfo para ver dónde se ha ido. Si se trata de dentries o inodos, puede usar sync ; echo 2 > /proc/sys/vm/drop_caches para deshacerse de ellos.

También puede usar la herramienta slabtop para mostrar el uso actual de la memoria caché Slab en un formato amigable. c ordenará la lista por tamaño de caché actual.

+0

Esta es la solución. Me pregunto si hay alguna manera de limitar que el kernel consuma toda la memoria libre o más para este caché. Supongo que recuperará memoria de este caché si las aplicaciones lo necesitan, pero las herramientas de supervisión de memoria no parecen tenerlo en cuenta, por lo que me gritan que no me queda memoria libre. –

+1

@Zoltan: No estoy seguro. Siendo Stack Overflow, sugiero que se arregle la herramienta de monitoreo de memoria para que agregue 'SReclaimable'. ¿Qué entrada de losa fue responsable de la mayor parte del uso? – caf

+0

De hecho, inicié sesión solo para votar esta respuesta. He tenido un servidor que informa que se utilizaron 1.6 GB de RAM (de 2 GB, lo que era preocupante), cuando sus aplicaciones consumían como máximo 300 MB. El 'echo' lo resolvió (190 * real * usó MBs). La causa raíz probablemente fue un script logrotate mal configurado que creó millones de archivos con nombres como /var/log/dovecot/dovecot.log.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.gz.2. gz. A veces, en Linux, parece que viajamos a Twilight Zone y de regreso. –

3

No puede simplemente agregar las columnas RSS o VSZ para obtener la cantidad de memoria utilizada. Desafortunadamente, el uso de memoria en Linux es mucho más complicado que eso. Para obtener una descripción más detallada, consulte Understanding memory usage on Linux, que explica cómo las bibliotecas compartidas se comparten entre los procesos, pero las herramientas como el ps cuentan dos veces.

No sé de manera simple cómo calcula los números que muestra, pero si necesita más detalles siempre puede desenterrar su código fuente.

+0

Ese fue un enlace muy informativo. Gracias – Sk606

1

Creo que le faltan los valores de memoria compartida. No creo que ps informe la RAM compartida como parte del campo RSS. Compare con el campo RES top para ver.

Por supuesto, si agrega en la memoria RAM compartida, ¿cuánto agrega? Debido a que se comparte, la misma RAM puede aparecer acreditada en muchos procesos diferentes.

Puede intentar solucionar ese problema mediante el análisis creativo de los archivos/proc/[pid]/smaps.

Pero aún así, eso solo te lleva a una parte del camino. Algunas páginas de memoria se comparten pero se contabilizan como residentes. Estas páginas se comparten después de una llamada fork(). Pueden dejarse de compartir en cualquier momento, pero hasta que no se contabilicen para la RAM de sistema total utilizada. El archivo proc smaps tampoco los muestra.

+0

En cualquiera de estos casos, ¿la memoria RSS que se está agregando no debe ser demasiado alta en lugar de demasiado baja? –

Cuestiones relacionadas