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
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 ...
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.
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