2015-11-16 7 views
15

sagen, dass ich ein Mongo DB-Server zu starten:MongoDB - Verschiedene Abfrageausführungszeiten nach der Server-Neustart

mongo --dbpath=/some/path --port=12345 --storageEngine wiredTiger

ich dann eine die gleiche Abfrage 10 mal laufen (die erste abgesehen, so dass sie alle sind an warmer Cache) wie folgt:

mongo query1.js

die Zeiten, die wir bekommen sind (wie über time und auch die mongodb Logger) verifiziert:

8137ms 8145ms 8193ms 8091ms 8152ms 8110ms 8182ms 8142ms 8133ms 8098ms

Großartig - ziemlich konsistent. Alle sind innerhalb ~ 100ms voneinander, was sinnvoll ist.

ich dann den Server herunterfahren, in jede der folgenden Moden:

pkill mongod mongod --dbpath=/some/path --shutdown mongo shutdown.js

Wo shutdown.js enthält:

db.getSiblingDB('admin').shutdownServer();

ich es dann neu zu starten, genau das gleiche mit Befehl, und ich bekomme folgende Zeiten:

8531ms 8492ms 8613ms 8555ms 8538ms 8512ms 8551ms 8511ms 8608ms 8522ms

Auch sie sind durchweg innerhalb von ~ 100 ms, aber sie sind alle auf einer anderen Baseline.

Wenn ich das wieder mache, könnte es um 8.3, 8.6, 8.9, oder irgendwo dazwischen wirklich sein. Es sind keine anderen Benutzerprozesse geöffnet (mit Ausnahme derjenigen, die für den Zugriff auf den Computer benötigt werden).

lief ich ein Experiment wie folgt:

while True: run the query 25 times and record the minimum such runtime shutdown the server and restart it, wait for it to listen

Dies lief für zwei Tage über das Wochenende, während ich nicht mit der Maschine interagieren hat, 223 Datenpunkte zu sammeln, und die Mindestlaufzeiten reichten von 7.9s zu 8.9s. Wenn ich den Server nicht zwischendurch heruntergefahren habe, passiert das nicht, aber wieder könnte ich eine Basislinie von 7.9s bekommen oder ich könnte eine von 8.9s bekommen.

Die Standardabweichung von einem Datenpunkt (die Laufzeiten der 25 Abfragen) war immer sehr niedrig (etwa 0,06), aber zwischen allen Abfragen war wirklich hoch.

Hat jemand Intuition darüber, warum das passiert und wie ich es verhindern kann? Ich versuche herauszufinden, ob eine Abfrage schneller ist als eine andere, aber ich kann keine gute Basislinie zum Testen bekommen. Das Neustarten des Servers ist nicht unbedingt notwendig, aber es würde mein Leben einfacher machen, da ich den Server nicht immer laufen lasse.

+0

Diese Abfragen sollten alle als Teil der langsamen Abfrageprotokollierung in der Mongod-Protokolldatei protokolliert werden. Können Sie bestätigen, ob für jeden Stapel derselbe Index verwendet wird? –

+0

Diese bestimmte Abfrage ist ein Aggregat, das nur eine $ -Gruppe erstellt und sie dann sortiert, so dass ein Index überhaupt nicht verwendet wird (er muss einen COLLSCAN ausführen). Ich bin mir nicht sicher, ob das irgendwas bewirkt. Ich habe übrigens die Anzahl der Instruktionen und Cache-Misses über Valgrind verifiziert. Ich erhalte eine Varianz von etwa 0,005% bei Instruktionszählungen (ein halbes Prozent) und vernachlässigbare Cache-Änderungen, wobei die Abfragezeiten um bis zu 6% variieren können, obwohl sie innerhalb eines Starts des Servers nur um etwa ein Prozent variieren. Es ist sehr seltsam. – user1661781

+0

Beginnen Sie Mongod, Numactl zu deaktivieren? Was ist die genaue Version von Mongod, von OS, Dateisystem, etc? –

Antwort

0

MongoDB verwendet den Cache, um einige Abfragen zu beantworten, während Sie fortfahren. Wenn Sie den Server neu starten, müssen einige Caches gelöscht werden. MongoDB speichert alle zuletzt verwendeten Daten im RAM.Wenn Sie Indizes für Ihre Abfragen erstellt haben und Ihr Arbeitsdatensatz in den Arbeitsspeicher passt, führt MongoDB alle Abfragen aus dem Arbeitsspeicher aus.

Abfragepläne werden im Cache gespeichert, der beim Neustart von Mongo gelöscht wird. So braucht es Zeit, wenn Sie die Abfrage zum ersten Mal ausführen. Siehe explain ("executionStats").

Mit WiredTiger verwendet MongoDB sowohl den Dateisystem-Cache als auch den WiredTiger-Cache. Standardmäßig verwendet der WiredTiger-Cache ab MongoDB 3.2 60% des Arbeitsspeichers minus 1 GB oder verwendet 1 GB, je nachdem, welcher Wert größer ist. Bei Systemen mit bis zu 10 GB RAM ist dies kleiner oder gleich der Einstellung von 3.0. Bei Systemen mit mehr als 10 GB RAM ist die Konfiguration größer als die Einstellung 3.0.

In MongoDB 3.0 verwendet der WiredTiger-Cache standardmäßig entweder 1 GB oder die Hälfte des installierten physischen RAM, je nachdem, welcher Wert größer ist.

MongoDB verwendet automatisch auch den gesamten freien Speicher auf der Maschine über den Dateisystemcache (Daten im Dateisystemcache werden komprimiert).

Siehe MongoDB Fundamentals

+0

Wenn Cache das Problem war, sollte das nicht irgendwann herausgefunden werden, nachdem die Abfrage einige Male ausgeführt wurde, um den Cache zu erwärmen? Außerdem passt die gesamte Datenbank beide Male in den Speicher (ungefähr 30% des RAM), so dass genügend Platz für den Cache übrig bleibt. – user1661781

+0

Haben Sie die Antwort dafür? –

1

MongoDB die aktuelle Verarbeitung von Daten im RAM hält so Ihre Anfrage Anfrage unterschiedliche Zeit in derselben Anfrage in Anspruch nehmen. This link wird Ihnen helfen.

Verwandte Themen