2012-09-12 13 views
9

Estoy viendo un enorme (~ 200 ++) faltas/seg número en mi salida mongostat, aunque muy bajo bloqueo%:Mongo que sufre de un gran número de fallos

enter image description here

Mis servidores Mongo están ejecutando en casos m1.large en la nube de Amazon, por lo que cada uno tiene 7,5 GB de RAM ::

root:~# free -tm 
      total  used  free  shared buffers  cached 
Mem:   7700  7654   45   0   0  6848 

Claramente, no tienen suficiente memoria para toda la mongo cahing quiere hacer (que, por cierto, resulta en un gran uso de CPU%, debido a IO de disco).

Encontré this document que sugiere que en mi escenario (alto error, bajo bloqueo%), necesito "escalar lecturas" y "más IOPS de disco".

Estoy buscando consejos sobre cómo lograr esto. A saber, hay MUCHAS consultas posibles diferentes ejecutadas por mi aplicación node.js, y no estoy seguro de dónde está pasando el cuello de botella. Por supuesto, he intentado

db.setProfilingLevel(1); 

Sin embargo, esto no me ayuda mucho, ya que las estadísticas emitidas sólo me muestran consultas lentas, pero estoy teniendo un tiempo difícil traducir esa información en el que las consultas son haciendo que los fallos de página ...

Como se puede ver, esto se traduce en un tiempo (casi 100%) de la CPU espera enorme en mi servidor mongo PRIMARIA, aunque los servidores secundarios 2x no se ven afectadas ...

enter image description here

Esto es lo que Mongo docs tiene que decir acerca de las fallas de página:

Las fallas de página representan el número de veces que MongoDB requiere datos no ubicados en la memoria física, y deben leer desde la memoria virtual. Para comprobar si hay errores de página, consulte el valor de extra_info.page_faults en el comando serverStatus. Esta información solo está disponible en sistemas Linux.

Solo, las fallas de página son menores y se completan rápidamente; sin embargo, en conjunto, un gran número de fallas de página típicamente indica que MongoDB está leyendo demasiados datos del disco y puede indicar una serie de causas y recomendaciones subyacentes. En muchas situaciones, los bloqueos de lectura de MongoDB "cederán" después de un error de página para permitir que otros procesos lo lean y evitar el bloqueo mientras se espera que la página siguiente lea en la memoria. Este enfoque mejora la concurrencia, y en sistemas de gran volumen, esto también mejora el rendimiento general.

Si es posible, aumentar la cantidad de RAM accesible para MongoDB puede ayudar a reducir el número de fallas de página. Si esto no es posible, le recomendamos que implemente un clúster de fragmentos y/o agregue uno o más fragmentos a su implementación para distribuir la carga entre las instancias de mongod.

tanto, he intentado el comando recomendada, que es terriblemente inútil:

PRIMARY> db.serverStatus().extra_info 
{ 
    "note" : "fields vary by platform", 
    "heap_usage_bytes" : 36265008, 
    "page_faults" : 4536924 
} 

Por supuesto, podría aumentar el tamaño del servidor (más RAM), pero eso es caro y parece ser una exageración. Debería implementar sharding, pero en realidad no estoy seguro de qué colecciones necesitan fragmentación. Por lo tanto, necesito una forma de aislar dónde están ocurriendo las fallas (qué comandos específicos están causando fallas).

Gracias por la ayuda.

+1

Sé que esta es una vieja pregunta, pero un par de cosas saltan. Después de establecer 'db.setProfilingLevel (1)', necesita tomar esas consultas y ejecutar 'explain()' en ellas. Lo más probable es que estas consultas no utilicen índices y realicen escaneos de recopilación completos. El hecho de que sus secundarios estén inactivos es otra causa de preocupación, dependiendo de la configuración de su aplicación, "slaveOk = true" puede ayudar al poner parte de la carga en los secundarios. Me aseguraría de que tus índices estén bien primero o si simplemente estás diseminando la miseria a los secundarios. – hwatkins

Respuesta

6

Realmente no sabemos cómo son sus datos/índices.

Aún así, una regla importante de la optimización MongoDB:
Asegúrese de que sus índices quepan en la RAM. http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-MakesureyourindexescanfitinRAM.

Tenga en cuenta que cuanto más pequeños sean sus documentos, mayor será la proporción de clave/documento, y mayor será su relación RAM/Disksize.

Si puede ajustar su esquema un poco para agrupar algunos datos y reducir el número de claves que necesita, eso podría ayudar.

+0

Parece que me perdí la parte en "un índice por consulta". También estaba siendo demasiado entusiasta con mi uso de índices alrededor de mi esquema, porque no conocía la restricción "debe encajar en la memoria RAM". Sin embargo, pregunta rápida acerca de la indexación de las mejores prácticas: cuando ejecuto una consulta que también utiliza un sort() o un límite(), ¿debería indexar esos campos? ¿Qué sucede cuando tengo consultas que buscan en múltiples condiciones (por ejemplo, {'age': 30, 'name': y}, ¿hay alguna buena manera de decidir cuál de las 2 columnas (¿ambas?) Debe indexarse? –

+0

también - Después de ejecutar db.XX.dropIndexes(), ¿hay algo que tenga que hacer para recuperar recursos/detener fallas de página en mi servidor mongo? Dejé caer todos mis índices y reindexé de una manera mucho más conservadora, pero no estoy viendo cualquier mejora aún. –

+0

En cuanto a su primera pregunta. Es difícil responder a estas cosas en general. Estas son las preguntas constantes que hacemos y las compensaciones que hacemos con el diseño de esquema. Para índices compuestos, si está buscando el campo A, o A, B o A, B, C luego puedes crear un índice compuesto en [A, B, C]. Si luego buscas en B o C, no te ayudará. Http://www.mongodb.org/display/DOCS/Índices # Índices-CompoundKeys – z5h

Cuestiones relacionadas