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 top
comando, 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).
lsb-release -a
yuname -a
por favor)uname
pero no lo tengolsb-release
instalado.Respuestas:
El tamaño de la memoria residente representa el número de páginas en memoria realmente tocadas por el
mongod
proceso. 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í: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.
fuente