Ich habe die folgende Konfiguration:
- Ein Host-Computer, auf dem drei Docker-Container ausgeführt werden:
- MongoDB
- Redis
- Ein Programm, das die beiden vorherigen Container zum Speichern von Daten verwendet
Sowohl Redis als auch MongoDB werden zum Speichern großer Datenmengen verwendet. Ich weiß, dass Redis alle Daten im RAM behalten muss, und ich bin damit einverstanden. Leider nimmt Mongo viel RAM ein und sobald der Host-RAM voll ist (wir sprechen hier von 32 GB), stürzt entweder Mongo oder Redis ab.
Ich habe die folgenden vorherigen Fragen dazu gelesen:
- Beschränken Sie die MongoDB-RAM-Nutzung : Anscheinend wird der größte Teil des RAM vom WiredTiger-Cache belegt
- MongoDB-Speicherbegrenzung : Hier waren anscheinend Protokolldaten das Problem
- Begrenzen Sie die RAM-Speichernutzung in MongoDB : Hier wird vorgeschlagen, den Speicher von Mongo so zu begrenzen, dass weniger Speicher für Cache / Protokolle / Daten verwendet wird
- MongoDB verwendet zu viel Speicher : Hier heißt es, dass es sich um ein WiredTiger-Caching-System handelt, das tendenziell so viel RAM wie möglich verwendet, um einen schnelleren Zugriff zu ermöglichen. Sie geben auch an
it's completely okay to limit the WiredTiger cache size, since it handles I/O operations pretty efficiently
- Gibt es eine Option zur Begrenzung der Mongodb-Speichernutzung? : wieder zwischenspeichern, fügen sie auch hinzu
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
- MongoDB-Index / RAM-Beziehung : Zitat:
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.
- Wie kann ich das von MongoDB verwendete Caching freigeben? : gleiche Antwort wie in 5.
Was ich aus all diesen Antworten zu verstehen scheine, ist Folgendes:
- Für einen schnelleren Zugriff ist es für Mongo besser, alle Indizes in den RAM zu passen. In meinem Fall kann ich jedoch Indizes verwenden, die sich teilweise auf der Festplatte befinden, da ich eine recht schnelle SSD habe.
- RAM wird hauptsächlich zum Zwischenspeichern durch Mongo verwendet.
In Anbetracht dessen hatte ich erwartet, dass Mongo versuchen würde, so viel RAM-Speicherplatz wie möglich zu nutzen, aber auch mit wenig RAM-Speicherplatz funktionieren und die meisten Dinge von der Festplatte abrufen kann. Ich habe jedoch den Speicher des Mongo Docker-Containers (zum Beispiel auf 8 GB) begrenzt, indem ich --memory
und verwendet habe --memory-swap
. Statt jedoch Daten von der Festplatte abzurufen, stürzte Mongo einfach ab, sobald der Speicher knapp wurde.
Wie kann ich Mongo zwingen, nur den verfügbaren Speicher zu verwenden und alles von der Festplatte abzurufen, was nicht in den Speicher passt?
dmesg
die mit dem unerwarteten Herunterfahren zusammenhängen? Die wahrscheinlichste Möglichkeit bei Docker besteht darin, dass Prozesse im Container den insgesamt verfügbaren RAM und nicht das Containerlimit erkennen.
mongod
in einem Behälter ( lxc
, cgroups
, Dockarbeiter, etc.) , die sich nicht haben Zugriff auf alle verfügbaren RAM in einem System, müssen Sie storage.wiredTiger.engineConfig.cacheSizeGB
auf einen Wert kleiner als die Menge an RAM in der Kontainer. Die genaue Menge hängt von den anderen Prozessen ab, die im Container ausgeführt werden, sollte jedoch normalerweise nicht über dem Standardwert von 50% des Arbeitsspeichers minus 1 GB liegen.