MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB lädt Dokumente für eine bessere Leistung vorab in den Arbeitsspeicher

Ihr beobachtetes Leistungsproblem bei einer ersten Abfrage ist wahrscheinlich eines der folgenden Probleme (in grober Reihenfolge der Wahrscheinlichkeit):

1) Ihre Anwendung / Ihr Webdienst hat einen gewissen Overhead für die Initialisierung bei der ersten Anfrage (d. h. Speicher zuweisen, Verbindungspools einrichten, DNS auflösen, ...).

2) Von Ihnen angeforderte Indizes oder Daten sind noch nicht im Speicher und müssen geladen werden.

3) Der Abfrageoptimierer Die Ausführung bei der ersten Anfrage kann etwas länger dauern, da die Planausführung für Ihr Abfragemuster verglichen wird.

Es wäre sehr hilfreich, die Abfrage über den mongo zu testen Shell und isolieren Sie, ob der Overhead mit MongoDB oder Ihrem Webdienst zusammenhängt (anstatt beides zu timen, wie Sie es getan haben).

Im Folgenden finden Sie einige Hinweise zu MongoDB.

Caching

MongoDB hat keine „Caching“-Zeit für Dokumente im Arbeitsspeicher. Es verwendet speicherabgebildete Dateien für Festplatten-E/A und die Dokumente im Speicher basieren auf Ihren aktiven Abfragen (Dokumente/Indizes, die Sie kürzlich geladen haben) sowie dem verfügbaren Speicher. Der virtuelle Speichermanager des Betriebssystems ist für das Caching zuständig , und folgt in der Regel einem Least-Recently Used (LRU)-Algorithmus, um zu entscheiden, welche Seiten aus dem Speicher ausgelagert werden sollen.

Speichernutzung

Das erwartete Verhalten ist, dass MongoDB im Laufe der Zeit wächst, um den gesamten freien Speicher zum Speichern Ihres aktiven Arbeitsdatensatzes zu verwenden.

Betrachten Sie Ihre bereitgestellte db.stats() Nummern (und vorausgesetzt, das ist Ihre nur Datenbank), es sieht so aus, als ob Ihre Datenbank derzeit etwa 1 GB groß ist, also sollten Sie in der Lage sein, alles in Ihren 10 GB Gesamt-RAM zu behalten, es sei denn:

  • Es gibt andere Prozesse, die um Speicher konkurrieren
  • Sie haben Ihren mongod neu gestartet Server und diese Dokumente/Indizes wurden noch nicht angefordert

In MongoDB 2.2 gibt es einen neuen touch Befehl, mit dem Sie Indizes oder Dokumente nach einem Serverneustart in den Arbeitsspeicher laden können. Dies sollte nur beim ersten Start verwendet werden, um den Server "aufzuwärmen", da Sie sonst die tatsächlich "aktiven" Daten aus dem Speicher zwingen könnten.

Auf einem Linux-System können Sie beispielsweise top verwenden Befehl und sollte Folgendes sehen:

  • virtuelle Bytes/VSIZE sind in der Regel die Größe der gesamten Datenbank
  • Wenn auf dem Server keine anderen Prozesse laufen, sind residente Bytes/RSIZE der Gesamtspeicher der Maschine (dies schließt den Inhalt des Dateisystem-Cache ein)
  • mongod sollte kein Swap verwenden (da die Dateien speicherabgebildet sind)

Sie können den mongostat verwenden Tool, um einen schnellen Überblick über Ihren mongod zu erhalten Aktivität .. oder, was sinnvoller ist, einen Dienst wie MMS verwenden um Metriken im Laufe der Zeit zu überwachen.

Abfrageoptimierer

Der Query Optimizer von MongoDB vergleicht die Planausführung für ein Abfragemuster alle ~1.000 Schreibvorgänge und speichert dann den "gewinnenden" Abfrageplan zwischen, bis der Optimierer das nächste Mal ausgeführt wird. //www.mongodb.org/display/DOCS/Explain">explain() auf diese Abfrage.

Dies sollte einfach zu testen sein:Führen Sie Ihre Abfrage im mongo aus Shell mit .explain() und schauen Sie sich die MS-Timings sowie die Anzahl der Indexeinträge und gescannten Dokumente an. Das Timing für ein explain() ist nicht die tatsächliche Zeit, die die Abfragen für die Ausführung benötigen, da es die Kosten für den Vergleich der Pläne beinhaltet. Die typische Ausführung wird viel schneller sein ... und Sie können in Ihrem mongod nach langsamen Abfragen suchen log.

Standardmäßig protokolliert MongoDB alle Abfragen, die langsamer als 100 ms sind, sodass dies ein guter Ausgangspunkt für die Suche nach zu optimierenden Abfragen ist. Sie können den langsamen ms-Wert mit dem --slowms config-Option oder mit dem Database Profiler Befehle.

Weiterführende Literatur in der MongoDB-Dokumentation: