2012-05-02 24 views
9

OK, quindi sto costruendo un'applicazione basata su Node.js e sto usando mangusta per gestire la mia connessione a mongodb. Ho un endpoint che è tale:Perché la mia chiamata di mongodb è così 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'); 
     } 
    }); 
} 

Per qualche motivo questa chiamata richiede 700 ms + per completare. La stessa chiamata senza nemmeno applicare un limite fatto da shell mongodb ritorna in circa 4ms. Sembra una query così semplice, quindi cosa lo rallenta così tanto? Immagino che mi sia sfuggito qualcosa di ovvio nella configurazione da qualche parte, ma non ne ho idea.

Grazie a tutti coloro che possono aiutare in questo.

Altre info:

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

io non sono estremamente familiarità con mangusta, quindi questo è solo un colpo nel Buio Avete bisogno di specificare il limite prima che il comando find? Perché forse sta andando fuori e recuperando i record subito a find(), e quindi stai cercando di ri-limitarlo in qualche modo? Questo sembra in qualche modo simile alla tua domanda: http://stackoverflow.com/questions/5539955/how-to-paginate-with-mongoose-in-node-js –

+0

La modifica della query per includere il limite come segue non influisce sulle prestazioni in qualsiasi modo ovvio. Activity.find ({}, {limit: 1000}) .run (funzione (err, attività) { –

+0

Quanto sono grandi i tuoi documenti? Puoi pubblicare un file db.coll.stats(). –

risposta

9

Dopo aver sperimentato per un po ', ho trovato diversi contributi alla lentezza, speriamo che questo aiuta chiunque con un problema simile:

  • Gli oggetti che sto chiedendo sono di grandi dimensioni, in modo da loro elaborazione richiede un certo tempo. Per oggetti di grandi dimensioni modificare la query per restituire solo i campi necessari al momento.
  • Mongoose è utile, ma può davvero rallentare quando si richiedono molti elementi, è meglio interfacciarsi direttamente con node-mongodb-native se si desidera la velocità per una chiamata. (Si trattava di un aumento della velocità del 50% + per il mio scenario)

Utilizzando queste tecniche ora posso elaborare 4000 record in meno tempo rispetto a quello che stavo elaborando 1000 prima. Grazie per tutti coloro che hanno commentato, e un ringraziamento speciale allo Gates VP per aver sottolineato che la mangusta non era particolarmente adatta per questo tipo di chiamate.

+1

Quanto erano grandi gli oggetti che stavi interrogando? Sarebbe bello avere un'idea approssimativa di quanto potrebbe essere grande un oggetto per causare il problema di perf che stavi vedendo. –

+2

Non erano enormi, è passato un po 'di tempo da quando ho affrontato questo problema, probabilmente 4 campi di stringa ciascuno di circa 50-100 caratteri. Tieni presente che ora la mangusta ha un'opzione [lean()] (http://mongoosejs.com/docs/api.html#query_Query-lean) che rimuove la maggior parte del wrapper getter/setter e anche [stream() ] (http://mongoosejs.com/docs/2.7.x/docs/querystream.html) in modo da poter ottenere i risultati così come sono stati trovati. –

+0

Grazie per la punta fuori per la magra. Attualmente sto recuperando ~ 280 record ma sono nidificati a più livelli in profondità, con alcuni sotto-documenti con 200 elementi. C'è voluta la mia richiesta di mangusta da 2,5 secondi a 15 ms (che è quello che stavo ottenendo nella shell mongo). – Leonidas

0

La stessa chiamata senza nemmeno l'applicazione di un limite di fatto i rendimenti shell MongoDB in circa 4 ms.

La shell applica un limite di 30 circa di default. Provate a fare dalla shell con un limite effettivo?

Inoltre, è possibile provare uno .explain() da Shell.

Se nessuna di queste funzioni, è possibile prendere il suggerimento di @Kyle Banker e controllare the profiler.

+0

Non sembrare ingrato, ma il problema non sembra mentire con mongodb. Come ho affermato in un altro commento sopra: "Se eseguo db.activities.find(). Limit (1000) .explain() all'interno della console/shell mongo, la query impiega meno di 5 millisecondi." Il profiler mostra gli stessi risultati su chiamate reali dall'endpoint. Sto presupponendo che sia una configurazione del driver o qualcosa a che fare con il wrapper mangusta perché finora non riesco a trovare difetti con la parte mongodb. –

+1

Così ho modificato i tag e ho aggiunto Mangusta. Se non ricevi una risposta qui, darei un'occhiata al loro gruppo Google. Si noti che Mongoose * sta * costruendo un oggetto per avvolgere ogni risultato che si sta estraendo dal DB. Quindi è abbastanza probabile che Mongoose non sia semplicemente ottimizzato per questo. –

+0

Ah buona chiamata. Pensavo di aver aggiunto mangusta ma apparentemente no. Ho provato questa stessa funzione con diversi (più piccoli) oggetti di database in un'altra collezione e appare circa 100ms più veloce, quindi potrebbe riguardare direttamente quanto sia complesso il record db su quanto tempo impiega la mangusta per avvolgere ogni record sul recupero. –

Problemi correlati