Wie beschleunige ich meinen Mongodb-Test?
-
09-12-2019 - |
Frage
Aus meinem Test erhalte ich ungefähr 500 Einfügungen, 200 Abfragen, 400 Aktualisierungen pro Sekunde.Ich frage mich, was ich optimieren kann, um diese Zahlen zu erhöhen.
Ich habe gelesen, dass andere in ihren Tests Tausende oder sogar Zehntausende von Einfügungen erreichen können, was weitaus besser ist als mein Test.Ich frage mich, ob mir etwas Grundlegendes fehlt?
Also, hier sind die Fakten :
- Ich verwende eine Win 32-Bit-Mongodb v2.0.3 mit Standardkonfiguration
- Java-Treiber (2.7.3) mit Spring Mongo, (ich erzwinge fsync nicht)
- Eine Kombination aus Einfügung und atomaren Aktualisierungen wie Push, Pull, inc, dez, Satz,
- Und wiederhole das alles 500k mal.
- Ziel ist es, Benutzeraktionen wie Einfügen und Aktualisieren zu simulieren
- Es sind keine spezifischen Indizes definiert, aber ich denke, standardmäßig wird es immer den eindeutigen Index für die ID geben?
- Die Java-App, die in der Eclipse-IDE ausgeführt wird, wird auf demselben Computer wie der Mongod-Server ausgeführt
- H / W-Spezifikation :kern i5, Speicher 4 GB, thinkpad edge
- Ich stelle fest, dass der Java-Prozess ungefähr 280 MB benötigt und in dieser Anzahl im Verlauf der Schleife stabil ist
Die Startzeit ist :2012-03-08 21:50:16
Und ich überwache mit Mongostat und nach Erreichen der Zeit von 22:05:10
, ich beende meine unvollendete Bewerbung ..und hier ist die letzte Ausgabe des Mongostaten
insert query update delete getmore command flushes mapped vsize res faults locked % idx miss % qr|qw ar|aw netIn netOut conn time
499 200 400 0 0 100 0 1023m 1.06g 581m 145 8.5 0 0|0 0|0 645k 97k 3 22:05:01
503 201 403 0 0 102 0 1023m 1.06g 582m 154 10.7 0 0|0 0|1 651k 98k 3 22:05:02
520 208 415 0 0 105 0 1023m 1.06g 582m 176 11.1 0 0|0 0|0 671k 101k 3 22:05:03
504 202 403 0 0 102 0 1023m 1.06g 582m 167 7.2 0 0|0 0|0 651k 98k 3 22:05:04
524 209 419 0 0 106 0 1023m 1.06g 582m 147 8.3 0 0|0 0|0 675k 102k 3 22:05:05
534 213 428 0 0 107 0 1023m 1.06g 583m 176 7.4 0 0|0 0|0 690k 103k 3 22:05:06
531 213 424 0 0 108 0 1023m 1.06g 584m 160 4.9 0 0|0 0|0 685k 104k 3 22:05:07
533 213 427 0 0 107 0 1023m 1.06g 584m 164 6.9 0 0|0 0|0 689k 103k 3 22:05:08
518 208 414 0 0 105 0 1023m 1.06g 585m 158 7.3 0 0|0 0|0 669k 101k 3 22:05:09
521 208 417 0 0 105 0 1023m 1.06g 585m 154 4.7 0 0|0 0|0 673k 101k 3 22:05:10
Und dann habe ich meine Insertionsnummer überprüft :
> db.myCollection.find().size();
90575
Und dies ist ein Beispiel für mein eingefügtes Dokument, das dabei auch aktualisiert wird usw.)
> db.myCollection.findOne().pretty();
{
"_id" : "b146189a-56a4-4035-8245-c4bd6dc2bd22",
"something1" : "my class is cool !",
"something2" : {
"value" : "this is a statement blah blah",
"name" : "myStatement"
},
"something3" : {
"size" : {
"value" : 0,
"name" : "size"
},
"value" : [
"6810cb0c-fa3e-4ca9-8a27-8432f2d1e828",
"a8276d05-a796-4c43-bc74-edc06d074099"
],
"name" : "myids"
},
"something4" : {
"myattr" : {
"value" : "something",
"name" : "name"
},
"attr" : {
"content" : {
"value" : "another another body body content content",
"name" : "content"
},
"contentId" : "b146189a-56a4-4035-8245-c4bd6dc2bd22",
"name" : "something"
},
"subsubchildchild" : {
"size" : {
"value" : 0,
"name" : "size"
},
"value" : [ ],
"name" : "subBodies"
},
"myId" : "b146189a-56a4-4035-8245-c4bd6dc2bd22",
"name" : "hiccups"
},
"something5" : {
"value" : false,
"name" : "hahaha"
},
"something6" : {
"name" : "okay this is just a test"
},
"something7" : {
"value" : false,
"name" : "remove me !"
},
"something8" : {
"size" : {
"value" : 0,
"name" : "size"
},
"value" : [ ],
"name" : "guess what"
},
"something9" : {
"size" : {
"value" : 0,
"name" : "anotherSize"
},
"value" : [ ],
"name" : "tarantula"
},
"something10" : {
"value" : 8,
"name" : "my exam score"
},
"something11" : {
"size" : {
"value" : 0,
"name" : "justAnotherSize"
},
"value" : [ ],
"name" : "myReference"
},
"something12" : {
"size" : {
"value" : 0,
"name" : "size"
},
"value" : [ ],
"name" : "myOtherReference"
},
"something13" : {
"value" : "8b78fff0-50f5-4992-9972-89f9d944fee7",
"name" : "user"
},
"something14" : {
"dateTime" : "2012-03-08 21:50:17.480000000"
},
"something15" : {
"value" : false,
"name" : "lovely"
}
}
Und hier ist mein DB-Status :
> db.stats();
{
"db" : "qa",
"collections" : 7,
"objects" : 815197,
"avgObjSize" : 622.2093211824872,
"dataSize" : 507223172,
"storageSize" : 610770944,
"numExtents" : 57,
"indexes" : 5,
"indexSize" : 64197952,
"fileSize" : 1056702464,
"nsSizeMB" : 16,
"ok" : 1
}
Auch eine andere Frage aus Neugier ..gemessen an meiner Hauptsammlungsgröße mit ungefähr 90 KB Datensätzen und anderen nicht wesentlichen Sammlungen, die nicht groß sein sollten, ist es in diesem Fall sinnvoll, ungefähr 1 TB Dateigröße zu haben?Kann ich irgendetwas tun, um meine Dateigröße zu reduzieren?
Bitte teilen Sie Ihre Gedanken.
Lösung
Sie scheinen viele Fehler auf dem zu bekommen mongostat
.Irgendeine Idee warum?
Eine Kombination aus Einfügung und atomaren Aktualisierungen wie Push, pull, inc, dec, set
Wie geben Sie diese Updates heraus?Von _id
?
Ich habe gelesen, dass andere in ihren Tests Tausende oder sogar Zehntausende von Einfügungen erreichen können, was weitaus besser ist als mein Test.Ich frage mich, ob mir etwas Grundlegendes fehlt?
GEM mongostat
sie haben nur 3 Verbindungen aktiv und Ihre Sperre% beträgt nur etwa 10%.
- Sind Sie Multi-Threading Ihre Eingaben?
- Ruinieren Sie das alles auf demselben Computer?
- Wie ist System IO?
- Machst du
WriteConcern.Safe
?
Dies sind alles Überlegungen, die sich auf Ihren Durchsatz auswirken könnten.
ist es in diesem Fall sinnvoll, etwa 1 TB Dateigröße zu haben?
Basis auf Ihrem db.stats()
, haben Sie nur etwa 600 MB Festplatte in Gebrauch.
"storageSize" : 610770944 // = 610,770,944
Ihre durchschnittliche Objektgröße beträgt 622 Byte, aber Sie haben 815.197 Objekte, nicht die 90 KB Dokumente, die Sie angeblich haben.
Kann ich irgendetwas tun, um meine Dateigröße zu reduzieren?
Ja, reduzieren Sie die Größe der Schlüssel in Ihren JSON-Dokumenten.Beispielsweise:
"something1" : "my class is cool !" => ~28 bytes
"s1": "my class is cool !" => ~20 bytes
Stellen Sie sicher, dass Sie die verkürzten Namen korrekt speichern, und lassen Sie Ihr Datenzugriffsframework die Zuordnung dieser zu vernünftigeren Namen aufheben.