MongoDB verwendet nicht den gesamten verfügbaren RAM


9

Ich habe Daten im Wert von etwa 200 GB in einem Mongo-Cluster gespeichert. Der physische Speicher auf einer der Instanzen, auf denen mongo ausgeführt wird, beträgt 8 GB. In dieser Instanz läuft nichts anderes von Bedeutung. Soweit ich anhand von Mongos Dokumenten verstehen kann (wie dieses: http://www.mongodb.org/display/DOCS/Checking+Server+Memory+Usage ), sollte der Mongod-Prozess ungefähr 100% von verwenden den verfügbaren physischen Speicher. Wenn Sie sich jedoch die folgende Ausgabe des topBefehls ansehen, werden Sie feststellen, dass die Mongod-Instanz nur 2 GB residenten Speicher verwendet und dass volle 2 GB freier physischer Speicher verfügbar sind, der überhaupt nicht verwendet wird.

Kann mir jemand dieses Verhalten erklären? Warum gibt es 2 GB freien Speicher?

top Ausgabe:

top - 23:19:43 up 89 days, 20:05,  2 users,  load average: 0.41, 0.55, 0.59
Tasks: 101 total,   1 running, 100 sleeping,   0 stopped,   0 zombie
Cpu(s):  2.0%us,  1.3%sy,  0.0%ni, 93.9%id,  2.6%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   8163664k total,  6131764k used,  2031900k free,    54976k buffers
Swap: 16771848k total,    10604k used, 16761244k free,  5367700k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                             
 1401 mongodb   20   0  174g 2.0g 1.9g S   23 26.2  18070:55 mongod
 ...

Systeminformationen:

$ uname -a
Linux aluminum 2.6.32-31-server #61-Ubuntu SMP Fri Apr 8 19:44:42 UTC 2011 x86_64 GNU/Linux

Anmerkungen:

  • Es gibt eine andere Instanz in diesem Cluster, in der sich Mongod wie erwartet verhält und den gesamten verfügbaren Speicher nutzt.
  • Mit Blick auf mongostat es wie konsequent einige Verwerfungen Seite aufweisenden wurden aussieht, so die Menge des verwendeten Speichers sollte wächst:
  • (Ich habe dieselbe Frage in der Google-Gruppe der Mongodb-Nutzer gestellt, aber keine Antwort erhalten.)

Welche Linux Distribution? Ist es 32 oder 64-Bit? (Bearbeiten Sie Ihre Frage mit der Ausgabe von lsb-release -aund uname -abitte)
Philᵀᴹ

Vielen Dank. Hinzugefügt, unameaber ich habe nicht lsb-releaseinstalliert.
Chris W.

Haben Sie versehentlich die 32-Bit-Version von MongoDB heruntergeladen? Die maximale Größe einer 32-Bit-Mongo-Instanz beträgt 2 GB.
Aaron

@ BryceAtNetwork23 nein; Wir haben definitiv mehr als 2 GB in unserer Mongodb-Summe (tatsächlich mehrere hundert Gigs).
Chris W.

@ChrisW er meint die maximale Speichergröße - nicht die Datenbankgröße. Und das scheint die 2 GB gut zu erklären.
Rfusca

Antworten:


5

Die Größe des residenten Speichers gibt die Anzahl der Seiten im Speicher an, die tatsächlich vom mongodProzess berührt wurden . Wenn dies erheblich niedriger ist als der verfügbare Speicher und die Daten den verfügbaren Speicher überschreiten (bei Ihnen), kann es sein, dass einfach noch nicht genügend Seiten aktiv berührt wurden.

Um festzustellen, ob dies der Fall ist, sollten Sie Folgendes ausführen free -m: Die Ausgabe sollte ungefähr so ​​aussehen:

free -m
             total       used       free     shared    buffers     cached
Mem:          3709       3484        224          0         84       2412
-/+ buffers/cache:        987       2721
Swap:         3836        156       3680

In meinem Beispiel liegt der zwischengespeicherte Wert nicht in der Nähe der Gesamtsumme, was bedeutet, dass mongod nicht nur nicht genügend Seiten berührt hat, sondern dass der Dateisystem-Cache noch nicht einmal von Seiten gefüllt wurde, die im Allgemeinen von der Festplatte gelesen werden.

Eine schnelle Lösung hierfür wäre der Touch-Befehl (hinzugefügt in 2.2). Er sollte bei großen Datenmengen mit Vorsicht verwendet werden, da versucht wird, alles in den Arbeitsspeicher zu laden, auch wenn die Daten viel zu groß sind, um zu passen (was viel verursacht) Festplatten-E / A- und Seitenfehler). Es wird sicherlich den Speicher effektiv füllen :)

Wenn Ihr zwischengespeicherter Wert nahe an der verfügbaren Gesamtsumme liegt, besteht Ihr Problem darin, dass eine große Anzahl von Seiten, die von der Festplatte in den Speicher eingelesen werden, für den Mongod-Prozess nicht relevant sind (und daher nicht davon berührt werden). Der übliche Kandidat für diese Art von Diskrepanz ist Readahead. Ich habe dieses spezielle Thema bereits an anderer Stelle ausführlich behandelt, daher werde ich diese beiden Antworten bei Bedarf nur für die zukünftige Lektüre verknüpfen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.