MongoDB: RAM-Anforderungen

20

Reicht es aus, den gesamten Index im Speicher / RAM zu haben, oder versucht Mongodb überhaupt, so viel RAM wie möglich zuzuweisen, um selbst die Daten für schnelle Lesevorgänge zu speichern?

Ich möchte mongodb + andere Anwendungen ausführen und es sieht so aus, als ob mongodb die einzige ist, die es mir nicht erlaubt, einen RAM-Bereich zu definieren, zum Beispiel "max_memory_allocated_or_reserved = 8GB".

Wenn es keine Möglichkeit dazu gibt, sollte ich Oom-Killer erklären, dass Mongod der "schlechte" Prozess ist, der meiner Meinung nach nicht die beste Praxis ist ...

ledy
quelle

Antworten:

18

Der wahre Grund, warum Sie nicht tun können, was Sie verlangen (den Speicher begrenzen), ist, dass MongoDB den von ihm verwendeten Speicher nicht direkt verwaltet - es lässt das Betriebssystem dies tun. MongoDB ordnet alle seine Daten nur im Speicher zu und lässt die Betriebssystemseite nach Bedarf im Arbeitsspeicher und außerhalb des Arbeitsspeichers anzeigen. Infolgedessen ist keine direkte Verwaltung der verwendeten Menge möglich, bis MongoDB dies auf eine völlig andere Art und Weise implementiert oder das Betriebssystem dies zulässt (unter Linux seit 2.4 Tagen nicht möglich).

Die einzige Möglichkeit, Ressourcen wirklich zu trennen, besteht derzeit darin, eine Virtualisierungslösung zu verwenden und MongoDB in einer eigenen VM zu isolieren. Ja, es gibt Overheads (obwohl Hypervisoren viel besser geworden sind), aber im Moment ist dies der Preis, der für diese Ebene der Ressourcenkontrolle zu zahlen ist.

In Bezug auf den OOM Killer kann MongoDB auch ohne andere Prozesse auf dem Host Probleme mit dem OOM Killer verursachen, solange Ihr Datensatz und Ihre Indizes insgesamt den verfügbaren Speicher übersteigen. Dies liegt daran, wie die Daten aus dem Arbeitsspeicher ausgelagert werden - wenn kein Arbeitsspeicherdruck besteht (nichts anderes möchte den residenten Arbeitsspeicher) und Sie ständig neue Daten und Indizes hinzufügen / berühren, wird der gesamte verfügbare Arbeitsspeicher mit der Zeit aufgebraucht. Daher die Empfehlung, beim Ausführen von MongoDB immer einen Swap zu konfigurieren:

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

Natürlich werden die LRU-Daten zuerst ausgelagert, andere Prozesse können ebenfalls das Gedächtnis beanspruchen, aber das Konzept gilt weiterhin, es sei denn, Sie laden Ihren Datensatz in den Speicher und dieser bleibt dann statisch. Das Beste, was Sie tun können, wenn Sie sich Sorgen machen, ist, es in MMS zu integrieren und die Nutzung im Laufe der Zeit zu verfolgen:

http://mms.mongodb.com

Update: August 2015

Seit ich diese Antwort geschrieben habe, sind die Dinge etwas weitergegangen und die Informationen sind etwas veraltet. Beispielsweise verfügt Linux jetzt über Cgroups und verwandte Technologien ( z. B. Docker-Container ), die so weit ausgereift sind, dass Sie die Ressourcen ( einschließlich des Speichers ), die von einem Prozess in einer Produktionsumgebung verbraucht werden , besser isolieren und begrenzen können, selbst wenn dieser verwendet wird Speicherzuordnung wie MongoDB.

Darüber hinaus können Sie mit der Einführung neuer Speicher-Engines jenseits von MMAP wie WiredTiger in MongoDB 3.0+ die integrierte Funktionalität verwenden, um die Cache-Größe für MongoDB zu begrenzen . Daher hängen die RAM-Anforderungen tatsächlich davon ab, wie Sie MongoDB konfigurieren, in welcher Umgebung Sie es ausführen und welche Speicher-Engine Sie auswählen.

Adam C
quelle
in Bezug auf WiredTiger: " Die Datei storage.wiredTiger.engineConfig.cacheSizeGB begrenzt nur die Größe des WiredTiger-Caches, nicht die Gesamtspeichermenge, die von Mongod verwendet wird. Der WiredTiger-Cache ist nur eine Komponente des von MongoDB verwendeten RAM. MongoDB verwendet auch automatisch alle Freier Speicherplatz auf der Maschine über den Dateisystem-Cache ... "
Stefan Rogin
Richtig, aber das Gleiche gilt für jede Anwendung, die Daten von der Festplatte paginiert. Der FS-Cache ist nicht mehr die primäre Cachemethode für die Daten, wie es früher bei Speicherzuordnungsdateien in der MMAP-Speicherengine der Fall war
Adam C
6

MongoDB verwendet den verfügbaren freien Speicher für das Caching und wechselt nach Bedarf auf die Festplatte, um Speicher für andere Anwendungen auf demselben Server bereitzustellen. Für die beste Leistung sollten Sie über genügend RAM verfügen, um Ihre Indizes und häufig verwendeten Daten ("Working Set") im Speicher zu halten.

Hilfreiche Lektüre:

Stennie
quelle
3

Über MongoDB hat sich in den letzten Jahren einiges geändert.

TL; DR

Wenn die MMAPv1-Speicher-Engine für MongoDB working setverwendet wird, muss die Größe dem RAM entsprechen . https://docs.mongodb.com/manual/faq/diagnostics/#must-my-working-set-size-fit-ram

Wenn die WiredTiger-Speicher-Engine in MongoDB verwendet wird, müssen Sie sich keineworking set Gedanken darüber machen, ob der Arbeitsspeicher geeignet ist oder nicht . https://docs.mongodb.com/manual/faq/diagnostics/#memory-diagnostics-for-the-wiredtiger-storage-engine

Speicherdiagnose für die WiredTiger Storage Engine

Muss meine Arbeitsspeichergröße dem Arbeitsspeicher entsprechen?

Nein.

Wie berechne ich, wie viel RAM ich für meine Anwendung benötige?

Mit WiredTiger verwendet MongoDB sowohl den internen Cache von WiredTiger als auch den Cache des Dateisystems.

In Version 3.2 geändert: Ab MongoDB 3.2 verwendet der interne WiredTiger-Cache standardmäßig den größeren der folgenden Werte:

60% des Arbeitsspeichers minus 1 GB oder 1 GB.

efkan
quelle
Nun, diese Antwort ist weder sehr hilfreich noch schrecklich genau.
Philip Schiff