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

Ist es möglich, die Mongoexport-Geschwindigkeit zu verbessern?

Es gibt viele Faktoren, die die Exportleistung einschränken.

  • Die Datengröße ist im Vergleich zum verfügbaren Arbeitsspeicher relativ groß:~2 TB vs. ~5 GB WiredTiger-Cache (bei Standardeinstellung). Das heißt:
    • Der gesamte WiredTiger-Cache kann nur bestenfalls enthalten ~0,22 % der Sammlung, in Wirklichkeit ist es sehr wahrscheinlich viel weniger, da der Cache Daten aus anderen Sammlungen und Indizes enthalten würde.
    • Das bedeutet, dass WiredTiger sehr häufig Daten von der Festplatte abrufen muss, während der aktuelle Inhalt des Caches gelöscht wird. Wenn der Replikatsatz aktiv verwendet wird, würde dies bedeuten, dass "schmutzige" Daten aus dem Cache entfernt und auf der Festplatte gespeichert werden, was einige Zeit in Anspruch nehmen würde.
    • Beachten Sie, dass Dokumente im WiredTiger-Cache nicht komprimiert werden.
  • Die Sammlung enthält große Dokumente, von denen Sie nur einen Teil benötigen. Dies bedeutet, dass zusätzliche Zeit für die Bearbeitung der Dokumente erforderlich ist.
  • Die Sammlung ist mit zlib komprimiert, was bedeutet, dass zusätzliche Zeit aufgewendet werden muss, um die Dokumente zu dekomprimieren.
  • Die readPreference ist secondaryPreferred , was bedeutet, dass versucht wird, von einem sekundären zu lesen. Wenn aktiv in den Replikatsatz geschrieben wird, blockieren oplog-Anwendungsvorgänge auf dem sekundären Lesegerät. Dies wird eine weitere Verzögerung hinzufügen.

Eine mögliche Verbesserung besteht darin, bei häufig durchgeführten Vorgängen einen Index für die relevanten Felder zu erstellen und ihn mithilfe eines abgedeckte Abfrage könnte die Leistung verbessern, da der Index kleiner als die vollständigen Dokumente wäre.

Bearbeiten:Ausführen von mongoexport parallel kann in diesem Fall hilfreich sein:

Zusätzlich zu den bereitgestellten zusätzlichen Informationen habe ich einen Test durchgeführt, der dieses Problem etwas zu lindern scheint.

Es scheint, dass mongoexport ausgeführt wird parallel, wo jeder mongoexport Durch die Handhabung einer Teilmenge der Sammlung kann der Export möglicherweise beschleunigt werden.

Teilen Sie dazu die _id Namespace, der der Nummer von mongoexport entspricht Prozess, den Sie ausführen möchten.

Wenn ich zum Beispiel 200.000 Dokumente habe, beginnend mit _id:0 zu _id:199,999 und mit 2 mongoexport Prozesse:

mongoexport -q '{"_id":{"$gte":0, "$lt":100000}}' -d test -c test > out1.json &
mongoexport -q '{"_id":{"$gte":100000, "$lt":200000}}' -d test -c test > out2.json &

wobei im obigen Beispiel die beiden mongoexport Prozesse bearbeiten jeweils die Hälfte der Sammlung.

Beim Testen dieses Workflows mit 1 Prozess, 2 Prozessen, 4 Prozessen und 8 Prozessen komme ich zu den folgenden Zeiten:

Verwendung von 1 Prozess:

real    0m32.720s
user    0m33.900s
sys 0m0.540s

2 Prozesse:

real    0m16.528s
user    0m17.068s
sys 0m0.300s

4 Prozesse:

real    0m8.441s
user    0m8.644s
sys 0m0.140s

8 Prozesse:

real    0m5.069s
user    0m4.520s
sys 0m0.364s

Abhängig von den verfügbaren Ressourcen wird 8 mongoexport ausgeführt parallele Prozesse scheinen den Prozess um einen Faktor von ~ 6 zu beschleunigen. Dies wurde in einer Maschine mit 8 Kernen getestet.

Hinweis :Halfers Antwort ist ähnlich, obwohl diese Antwort im Grunde versucht zu sehen, ob es einen Vorteil gibt, mongoexport aufzurufen parallel.