Ho la seguente configurazione:
- un computer host che esegue tre contenitori docker:
- MongoDB
- Redis
- Un programma che utilizza i due contenitori precedenti per memorizzare i dati
Sia Redis che MongoDB vengono utilizzati per archiviare enormi quantità di dati. So che Redis ha bisogno di conservare tutti i suoi dati nella RAM e sto bene. Sfortunatamente, ciò che accade è che mongo inizia a occupare molta RAM e non appena la RAM host è piena (stiamo parlando di 32 GB qui), o mongo o Redis si arresta in modo anomalo.
Ho letto le seguenti domande precedenti su questo:
- Limita l'utilizzo della RAM MongoDB : apparentemente la maggior parte della RAM viene utilizzata dalla cache WiredTiger
- Memoria limite MongoDB : qui apparentemente il problema erano i dati di registro
- Limita l'utilizzo della memoria RAM in MongoDB : qui suggeriscono di limitare la memoria di mongo in modo che utilizzi una quantità minore di memoria per cache / log / dati
- MongoDB utilizza troppa memoria : qui dicono che è il sistema di memorizzazione nella cache WiredTiger che tende a utilizzare quanta più RAM possibile per fornire un accesso più veloce. Inoltre affermano
it's completely okay to limit the WiredTiger cache size, since it handles I/O operations pretty efficiently
- C'è qualche opzione per limitare l'utilizzo della memoria di mongodb? : cache di nuovo, aggiungono anche
MongoDB uses the LRU (Least Recently Used) cache algorithm to determine which "pages" to release, you will find some more information in these two questions
- Indice MongoDB / relazione RAM : citazione:
MongoDB keeps what it can of the indexes in RAM. They'll be swaped out on an LRU basis. You'll often see documentation that suggests you should keep your "working set" in memory: if the portions of index you're actually accessing fit in memory, you'll be fine.
- come rilasciare la memorizzazione nella cache che viene utilizzata da MongoDB? : stessa risposta di 5.
Ora quello che sembra capire da tutte queste risposte è che:
- Per un accesso più veloce sarebbe meglio per mongo adattare tutti gli indici nella RAM. Tuttavia, nel mio caso, sto bene con gli indici parzialmente residenti su disco poiché ho un SSD abbastanza veloce.
- La RAM viene utilizzata principalmente per la memorizzazione nella cache da mongo.
Considerando questo, mi aspettavo che mongo provasse a utilizzare la maggior quantità di spazio RAM possibile, ma potendo funzionare anche con poco spazio RAM e recuperare la maggior parte delle cose dal disco. Tuttavia, ho limitato la memoria del contenitore di mongo Docker (ad esempio a 8 GB), usando --memory
e --memory-swap
, invece di recuperare roba dal disco, mongo si è semplicemente schiantato non appena ha esaurito la memoria.
Come posso forzare mongo a usare solo la memoria disponibile e a recuperare dal disco tutto ciò che non si adatta alla memoria?
dmesg
correlati all'arresto imprevisto? La possibilità più probabile con Docker è che i processi nel contenitore rilevino la RAM complessiva disponibile anziché il limite del contenitore.
mongod
in un contenitore ( lxc
, cgroups
, Portuale, etc.) che si fa , non hanno accesso a tutta la RAM disponibile in un sistema, è necessario impostare storage.wiredTiger.engineConfig.cacheSizeGB
un valore inferiore alla quantità di RAM disponibile Il container. L'importo esatto dipende dagli altri processi in esecuzione nel contenitore, ma in genere non dovrebbe essere superiore al valore predefinito del 50% della RAM meno 1 GB.