2015-12-28 21 views
7

Sto cercando di eseguire un numero di query mongodb tramite il nodo Async. Ma stanno ancora prendendo tempo per correre .. Il database è indicizzato e completamente ottimizzato. C'è un modo in cui posso aumentare la velocità della query tramite mongodb admin ... o come aumentare le sue prestazioni allocando più memoria ad esso.Query parallele di Mongodb via nodejs

Le query sono in esecuzione una per una quando vedo sulla console. e alcuni stanno prendendo troppo tempo ... con conseguente nessuna risposta ..

2015-12-29T10:31:48.958-0800 I COMMAND [conn63] command consumers.$cmd command: count { count: "consumer1s", query: { ZIP: 37089, $or: [ { ADULTS_F_18_24: "Y" }, { ADULTS_F_24_35: "Y" } ] } } planSummary: IXSCAN { ZIP: 1.0, GENDER: 1.0 } keyUpdates:0 writeConflicts:0 numYields:1 reslen:44 locks:{ Global: { acquireCount: { r: 4 } }, MMAPV1Journal: { acquireCount: { r: 4 } }, Database: { acquireCount: { r: 2 } }, Collection: { acquireCount: { R: 2 }, acquireWaitCount: { R: 2 }, timeAcquiringMicros: { R: 54270 } } } 146ms 

2015-12-29T10:31:54.925-0800 I COMMAND [conn62] command consumers.$cmd command: count { count: "consumer1s", query: { ZIP: 37024, $or: [ { ADULTS_F_18_24: "Y" }, { ADULTS_F_24_35: "Y" } ] } } planSummary: IXSCAN { ZIP: 1.0, GENDER: 1.0 } keyUpdates:0 writeConflicts:0 numYields:88 reslen:44 locks:{ Global: { acquireCount: { r: 178 } }, MMAPV1Journal: { acquireCount: { r: 172 } }, Database: { acquireCount: { r: 89 } }, Collection: { acquireCount: { R: 89 }, acquireWaitCount: { R: 83 }, timeAcquiringMicros: { R: 1654781 } } } 6114ms 

Hi consultare i registri per capire la mia domanda ... 2 domande seguenti stesso piano .. hanno una grande differenza di tempo di esecuzione ... Per favore dimmi il motivo e come risolverlo

Le seguenti informazioni devono essere utili. Sto lavorando questa applicazione su un sistema Macintosh. Processore OSX Yosemite 10.10.2 3.2Ghz Intel Core i5. La memoria è DDR3 da 8 GB a 1600 MHz. Qualche suggerimento su come allocare più memoria virtuale a mongodb

+2

È necessario esaminare i registri e monitorare l'utilizzo delle risorse durante le query. Non esiste un argento Bullit per migliorare le prestazioni delle query. Gli indici – Martin

+1

sono ... –

+0

Dipende dal tuo ambiente reale. È alta concorrenza o grandi dati? Ad esempio, se è elevata la concorrenza, è meglio usare 'redis' o' memcached' o altre soluzioni. Mentre, sto anche cercando il mongodb che si sta ottimizzando ... – hirra

risposta

0

Come ha detto @Martin, è necessario il profilo. Usa qualcosa come cursor.explain per assicurarti che la query stia usando gli indici e trovi i punti deboli. Usa qualsiasi risorsa monitorata dal tuo sistema (come top/htop su linux) per vedere se sta esaurendo la memoria o se è legata alla CPU.

"Le query sono in esecuzione una per una" - presumo che non stai utilizzando async.series o simile, che è sequenziale.

+0

Sto usando async.parallel ... –

+0

Le query non sono mai vincolate alla CPU, e intendo mai. Aggregazioni e inserimenti enormi di solito sono l'unica cosa ad alta intensità di CPU. Ho fatto un sacco di profiling delle prestazioni delle query, e le query non fanno quasi nulla alla CPU a meno che non ci sia una grande quantità di esse. Non esiste praticamente alcun operatore per query regolari che sia molto complicato, tranne che per la ricerca geospaziale e di testo. In realtà solo le aggregazioni consumano molta CPU, e di solito si trovano ancora nella parte inferiore. – tsturzl

+0

L'esecuzione in serie o in parallelo non dovrebbe fare una differenza notevole, qualsiasi cosa oltre 200ms per una query riguarda una query di base. La quantità di tempo risparmiata correndo in parallelo sarebbe piuttosto difficile da discernere per un essere umano. Dato che è probabilmente meglio in produzione, supponendo che non si eseguano 50 query in parallelo, ciò potrebbe diventare un punto per la DoS in quel caso. Di solito vado in serie quando sto elaborando un array di una dimensione sconosciuta, altrimenti parallelo se so che la dimensione non sarà oltre una certa quantità. Entrambi hanno uno scopo. – tsturzl