2010-05-11 2 views
29

Sto per adottare MongoDB per un nuovo progetto e l'ho scelto per flessibilità, non scalabilità, quindi lo eseguirò su una macchina. Dalla documentazione e dai post sul Web continuo a leggere che tutti gli indici sono nella RAM. Questo non ha senso per me dato che i miei indici saranno facilmente più grandi della quantità di RAM disponibile.Rapporto MongoDB/rapporto RAM

Qualcuno può condividere alcune informazioni sulla relazione indice/RAM e cosa succede quando sia un indice individuale che tutti i miei indici superano la dimensione della RAM disponibile?

risposta

28

MongoDB mantiene ciò che può degli indici nella RAM. Saranno scambiati su base LRU. Vedrai spesso la documentazione che suggerisce di tenere in memoria il tuo "working set": se le parti dell'indice a cui stai effettivamente accedendo si adattano alla memoria, starai bene.

+2

Per calcolare con precisione 'set' di lavoro, diciamo che ho una singola raccolta. Quindi, esegui 'db.collection.stats()'. Il 'filesize' o' datasize' indica il mio "working set?" –

8

Sono le dimensioni del working set più gli indici di MongoDB che dovrebbero idealmente risiedere nella RAM in ogni momento, cioè la quantità di RAM disponibile dovrebbe essere almeno la dimensione del working set più la dimensione degli indici più ciò che il resto del SO (Sistema operativo) e altri software in esecuzione sulle stesse esigenze della macchina. Se la RAM disponibile è inferiore, LRUing è ciò che accade e potremmo quindi ottenere un rallentamento significativo. Una cosa da tenere a mente è che in un indice btree vengono memorizzati i bucket, non le singole chiavi dell'indice, cioè se avessimo una distribuzione uniforme delle chiavi in ​​un indice incluso per i dati storici, potremmo aver bisogno di più dell'indice nella RAM rispetto a quando abbiamo un indice composto in tempo più qualcos'altro. Con quest'ultimo, le chiavi nello stesso secchio sono di solito della stessa epoca, quindi questo avvertimento non accade. Inoltre, dovremmo tenere presente che i nostri nomi di campo in BSON sono memorizzati nei record (ma non nell'indice), quindi se siamo sotto pressione di memoria dovrebbero essere mantenuti a breve.

Coloro che sono interessati all'utilizzo attuale della memoria virtuale di MongoDB (che ovviamente riguarda anche la RAM), possono dare un'occhiata allo stato di mongod.

@see http://www.markus-gattol.name/ws/mongodb.html#sec7

3

This article ha buona spiegazione chiara e semplice di come indici di mongodb si basano su RAM e I/O