2012-05-02 50 views
9

Bien, entonces estoy construyendo una aplicación basada en Node.js y estoy usando mangosta para manejar mi conexión a mongodb. Tengo un punto final que es tal:¿Por qué mi llamada mongodb es tan lenta?

getTestStream : function(req, res, conditions, callback) { 
    Activity.find() 
    .limit(1000) 
    .run(function(err, activities) { 
     if (err){ 
     util.sendError(req, res, "Query Error", err); 
     } else if (activities) {  
     res.send(activities); 
     } else { 
     util.send('nope'); 
     } 
    }); 
} 

Por alguna razón, esta llamada tarda 700ms + en completarse. La misma llamada sin aplicar un límite de mongodb shell regresa en unos 4 ms. Parece una consulta tan simple, así que, ¿qué está frenando tanto? Supongo que me he perdido algo obvio en la configuración en alguna parte, pero no tengo ni idea.

Gracias a todos los que pueden ayudar con esto.

otra información:

[email protected] 
[email protected] 
[email protected] 
+0

No estoy muy familiarizado con la mangosta, así que esto es sólo un tiro en el obscuro ¿Es necesario especificar su límite antes de su comando find? Porque tal vez está saliendo y recuperando los registros de inmediato en find(), y luego estás tratando de volver a limitarlo de alguna manera? Esto se parece algo a su pregunta: http://stackoverflow.com/questions/5539955/how-to-paginate-with-mongoose-in-node-js –

+0

La modificación de la consulta para incluir el límite de la siguiente manera no afecta el rendimiento en cualquier forma obvia Activity.find ({}, {límite: 1000})?. .run (function (err, actividades) { –

+0

¿Qué tamaño tienen sus documentos Se puede publicar un db.coll.stats() –

Respuesta

9

Después de experimentar durante un tiempo, he encontrado varias contribuciones a la lentitud, espero que esto ayuda a cualquier persona con un problema similar:

  • Los objetos que estoy solicitando son grandes, por lo que su procesamiento se lleva algún tiempo. Para objetos grandes, modifique la consulta para que solo devuelva los campos que necesita en este momento.
  • Mongoose es útil, pero puede realmente ralentizarse cuando solicita muchos elementos, es mejor interactuar directamente con node-mongodb-native si desea velocidad para una llamada. (Esto era un aumento de aproximadamente + 50% de velocidad para mi escenario)

uso de estas técnicas ahora puede procesar 4000 registros en menos tiempo de lo que era de procesamiento 1000 antes. Gracias a todos los que comentaron, y un agradecimiento especial al Gates VP por señalar que la mangosta no era realmente una buena opción para este tipo de llamadas.

+1

¿Qué tan grandes eran los objetos que consultaba? Sería bueno tener una idea aproximada de qué tan grande podría ser un objeto para causar el problema de perf que estaba viendo. –

+2

No eran enormes, ha pasado un tiempo desde que abordé este tema, probablemente 4 campos de cadena cada uno con aproximadamente 50-100 caracteres. Tenga en cuenta que ahora mongoose tiene una opción [lean()] (http://mongoosejs.com/docs/api.html#query_Query-lean) que elimina la mayor parte de cualquier ablandamiento de envoltura getter/setter, así como [stream() ] (http://mongoosejs.com/docs/2.7.x/docs/querystream.html) función para que pueda obtener resultados a medida que se encuentran. –

+0

Gracias por el consejo de Lean. Actualmente estoy recuperando ~ 280 registros, pero están anidados varios niveles de profundidad, con algunos documentos secundarios que tienen 200 elementos. Tomó mi consulta de mangosta de 2.5 segundos a 15ms (que es lo que estaba obteniendo en el caparazón de mongo). – Leonidas

0

la misma llamada sin incluso la aplicación de un límite a partir de rendimientos de concha mongodb en aproximadamente 4 ms.

La cáscara se aplica un límite de 30 o así de forma predeterminada. Intenta hacerlo desde el caparazón con un límite real?

También es posible que desee probar .explain() desde el Shell.

Si nada de eso funciona, entonces puede tomar la sugerencia de @Kyle Banker y verificar the profiler.

+0

No parece ingrato, pero el problema no parece estar en mongodb. Como dije en otro comentario anterior: "Si ejecuto db.activities.find(). Limit (1000) .explain() dentro de la consola/shell de mongo, la consulta tarda menos de 5 milisegundos". El generador de perfiles muestra los mismos resultados en llamadas reales desde el punto final. Supongo que es una configuración de controlador o algo que ver con la envoltura de mangosta porque hasta ahora no puedo encontrar defectos con la parte de mongodb. –

+1

Así que edité las etiquetas y agregué Mongoose. Si no obtiene una respuesta aquí, definitivamente verificaría su grupo de Google. Tenga en cuenta que Mongoose * está * creando un objeto para envolver cada resultado que está sacando de la base de datos. Entonces es muy posible que Mongoose simplemente no esté optimizado para eso. –

+0

Ah, buena llamada. Pensé que había agregado mangosta, pero aparentemente no. Probé esta misma función con objetos de base de datos diferentes (más pequeños) en otra colección y aparece aproximadamente 100 ms más rápido, por lo que podría relacionarse directamente con cuán complejo es el registro db en cuanto a cuánto tiempo lleva la mangosta para envolver cada registro en la recuperación. –

Cuestiones relacionadas