MongoDB: requisiti di RAM


20

È sufficiente avere l'intero indice in memoria / ram o mongodb tenta addirittura di allocare più ram possibile per memorizzare anche i dati per letture veloci?

Vorrei eseguire mongodb + altre applicazioni e sembra che mongodb sia l'unico che non mi consente di definire un intervallo di RAM, per dire "max_memory_allocated_or_reserved = 8GB".

Se non c'è modo di farlo, dovrei spiegare a Oom-Killer che il mongod è il processo "cattivo" che non è la migliore pratica secondo me ...

Risposte:


18

Il vero motivo per cui non puoi fare ciò che chiedi (limita la memoria) è perché MongoDB non gestisce la memoria che utilizza direttamente, ma consente al sistema operativo di farlo. MongoDB si limita a mappare tutti i suoi dati e quindi ha la pagina del sistema operativo dentro e fuori dalla memoria, se necessario. Di conseguenza, non esiste una gestione diretta della quantità utilizzata fino a quando MongoDB non lo implementa in un modo completamente diverso, o il sistema operativo lo consente (non possibile in Linux dai 2.4 giorni).

Al momento, l'unico modo per separare veramente le risorse è utilizzare una soluzione di virtualizzazione e isolare MongoDB nella propria VM. Sì, ci sono spese generali (anche se gli hypervisor sono migliorati molto), ma al momento è il prezzo da pagare per quel livello di controllo delle risorse.

In termini di OOM Killer, anche senza altri processi sull'host, purché il set di dati e gli indici superino la memoria disponibile, MongoDB può risolvere i problemi di OOM Killer. Ciò è dovuto al modo in cui i dati vengono paginati dalla memoria - se non c'è pressione di memoria (nient'altro vuole memoria residente) e continui ad aggiungere / toccare nuovi dati e indici, alla fine crescerà per consumare tutta la RAM disponibile. Da qui la raccomandazione di configurare sempre alcuni swap quando si esegue MongoDB:

https://docs.mongodb.com/manual/administration/production-notes/#swap

Ovviamente, i dati LRU verranno prima cercati, altri processi possono occupare anche il res mem, ma il concetto si applica comunque a meno che non si carichi il set di dati in memoria e poi rimanga statico. La cosa migliore da fare se sei preoccupato è metterlo in MMS e tenere traccia dell'utilizzo nel tempo:

http://mms.mongodb.com

Aggiornamento: agosto 2015

Da quando ho scritto questa risposta, le cose sono andate un po 'avanti e le informazioni sono un po' obsolete. Ad esempio, Linux ora ha cgroups e tecnologie correlate ( contenitori Docker per esempio) che sono maturati al punto da consentire di isolare e limitare meglio le risorse ( compresa la memoria ) consumate da qualsiasi processo in un ambiente di produzione, anche quello che utilizza mappatura della memoria come MongoDB.

Inoltre, con l'avvento di nuovi motori di archiviazione oltre MMAP come WiredTiger in MongoDB 3.0+, è possibile utilizzare la funzionalità integrata per limitare la dimensione della cache per MongoDB. Quindi, i requisiti di RAM ora dipendono davvero da come si sceglie di configurare MongoDB, dall'ambiente in cui lo si esegue e dal motore di archiviazione scelto.


per quanto riguarda WiredTiger: "Storage.wiredTiger.engineConfig.cacheSizeGB limita solo la dimensione della cache WiredTiger, non la quantità totale di memoria utilizzata da mongod. La cache WiredTiger è solo un componente della RAM utilizzata da MongoDB. MongoDB utilizza anche automaticamente tutti memoria libera sulla macchina tramite la cache del filesystem ... "
Stefan Rogin,

giusto, ma lo stesso si può dire di qualsiasi applicazione che pagine i dati dal disco, la cache di FS non è più il metodo di memorizzazione nella cache principale per i dati come una volta con i file mappati in memoria nel motore di archiviazione MMAP
Adam C

6

MongoDB utilizzerà la memoria disponibile disponibile per la memorizzazione nella cache e sostituirà il disco in base alle esigenze per produrre memoria ad altre applicazioni sullo stesso server. Per prestazioni ottimali, ti consigliamo di disporre di RAM sufficiente per mantenere in memoria gli indici e i dati utilizzati di frequente ("working set").

Lettura utile:


3

Qualcosa è cambiato negli anni su MongoDB.

TL; DR

Se il motore di archiviazione MMAPv1 viene utilizzato su working setdimensioni MongoDB deve adattarsi alla RAM . https://docs.mongodb.com/manual/faq/diagnostics/#must-my-working-set-size-fit-ram

Se il motore di archiviazione WiredTiger viene utilizzato su MongoDB, non c'è bisogno di preoccupazione per la RAM è adatto per working seto no . https://docs.mongodb.com/manual/faq/diagnostics/#memory-diagnostics-for-the-wiredtiger-storage-engine

Diagnostica della memoria per il motore di archiviazione WiredTiger

Le dimensioni del mio set di lavoro devono adattarsi alla RAM?

No.

Come calcolo la quantità di RAM necessaria per la mia applicazione?

Con WiredTiger, MongoDB utilizza sia la cache interna di WiredTiger che la cache del filesystem.

Modificato nella versione 3.2: A partire da MongoDB 3.2, la cache interna di WiredTiger, per impostazione predefinita, utilizzerà il più grande tra:

60% di RAM meno 1 GB o 1 GB.


bene questa risposta non è di grande aiuto, né terribilmente accurata.
Philip Schiff
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.