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.
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:
quelle
Über MongoDB hat sich in den letzten Jahren einiges geändert.
TL; DR
Wenn die MMAPv1-Speicher-Engine für MongoDB
working set
verwendet wird, muss die Größe dem RAM entsprechen . https://docs.mongodb.com/manual/faq/diagnostics/#must-my-working-set-size-fit-ramWenn die WiredTiger-Speicher-Engine in MongoDB verwendet wird, müssen Sie sich keine
working 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-enginequelle