MongoDB no utiliza toda la RAM disponible

9

Tengo algo de alrededor de 200 GB de datos almacenados en un clúster mongo. La memoria física en una de las instancias que ejecuta mongo es de 8 GB. Nada más de ninguna consecuencia se ejecuta en esta instancia. Por lo que puedo entender en base a los documentos de Mongo (como este: http://www.mongodb.org/display/DOCS/Checking+Server+Memory+Usage ), esto significa que el proceso mongod debería usar aproximadamente el 100% de La memoria física disponible. Pero si observa el siguiente resultado del topcomando, verá que la instancia de mongod solo está utilizando 2 GB de memoria residente y hay disponibles 2 GB completos de memoria física libre que no se está utilizando en absoluto.

¿Alguien puede explicarme este comportamiento? ¿Por qué hay 2 GB de memoria libre?

top salida:

top - 23:19:43 up 89 days, 20:05,  2 users,  load average: 0.41, 0.55, 0.59
Tasks: 101 total,   1 running, 100 sleeping,   0 stopped,   0 zombie
Cpu(s):  2.0%us,  1.3%sy,  0.0%ni, 93.9%id,  2.6%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   8163664k total,  6131764k used,  2031900k free,    54976k buffers
Swap: 16771848k total,    10604k used, 16761244k free,  5367700k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                             
 1401 mongodb   20   0  174g 2.0g 1.9g S   23 26.2  18070:55 mongod
 ...

Información del sistema:

$ uname -a
Linux aluminum 2.6.32-31-server #61-Ubuntu SMP Fri Apr 8 19:44:42 UTC 2011 x86_64 GNU/Linux

Notas:

  • Hay otra instancia en este clúster donde mongod se comporta como yo esperaría y utiliza toda la memoria disponible.
  • Mirando al mongostat, parece que constantemente tienen fallas en la página, por lo que la cantidad de memoria utilizada debería estar creciendo:
  • (Hice esta misma pregunta en el grupo de google mongodb-user pero no obtuve respuesta).
Chris W.
fuente
¿Qué distribución de Linux? ¿Es de 32 o 64 bits? (Edite su pregunta con la salida de lsb-release -ay uname -apor favor)
Philᵀᴹ
Gracias. Agregado unamepero no lo tengo lsb-releaseinstalado.
Chris W.
¿Descargó accidentalmente la versión de 32 bits de MongoDB? El tamaño máximo de una instancia de Mongo de 32 bits es de 2 GB.
Aaron
@ BryceAtNetwork23 no; definitivamente tenemos más de 2GB en nuestro total mongodb (varios cientos de conciertos en realidad).
Chris W.
@ChrisW se refiere al tamaño máximo de memoria, no al tamaño de la base de datos. Y eso parece que explicaría bien los 2GB.
rfusca

Respuestas:

5

El tamaño de la memoria residente representa el número de páginas en memoria realmente tocadas por el mongodproceso. Si eso es significativamente menor que la memoria disponible y los datos exceden la memoria disponible (la suya lo hace), entonces podría tratarse de simplemente no haber tocado activamente suficientes páginas todavía.

Para determinar si este es el caso, debe ejecutar free -m, la salida debería verse así:

free -m
             total       used       free     shared    buffers     cached
Mem:          3709       3484        224          0         84       2412
-/+ buffers/cache:        987       2721
Swap:         3836        156       3680

En mi ejemplo, el almacenamiento en caché no está cerca del total, lo que significa que no solo no ha tocado suficientes páginas, sino que el caché del sistema de archivos ni siquiera se ha llenado con páginas que se leen desde el disco en general.

Un remedio rápido para esto sería el comando táctil (agregado en 2.2): debe usarse con precaución en grandes conjuntos de datos, ya que intentará cargar todo en la RAM, incluso si los datos son demasiado grandes para caber (lo que causa una gran cantidad de disco IO y fallas de página). Sin embargo, sin duda llenará la memoria de manera efectiva :)

Si su valor en caché está cerca del total disponible, entonces su problema es que una gran cantidad de páginas que se leen en la memoria desde el disco no son relevantes (y, por lo tanto, no son tocadas) por el proceso mongod. El candidato habitual para este tipo de discrepancia es la lectura anticipada. Ya he cubierto ese tema en particular en otra parte en detalle, así que solo vincularé esas dos respuestas para futuras lecturas si es necesario.

Adam C
fuente