Das Ergebnis einfügen:Wie zur Verbesserung der MongoDB Leistung
Wenn Sie auf einem Datensatz arbeiten, den fehlertolerant ist, oder einen einmaliger Prozess machen Sie überprüfen können, kann WriteAcknowledge zu Unquittierte Ändern helfen.
Bulk-Operationen sind auch IsOrdered standardmäßig, die ich nicht bewusst war. Wenn Sie dies auf "False" (Falsch) setzen, wird die Operation in großen Mengen durchgeführt, andernfalls wird sie als ein Update-Thread ausgeführt.
MongoDB 3.0/WiredTiger/C# Treiber
Ich habe eine Sammlung mit 147 Millionen Dokumente, von denen ich Updates pro Sekunde (hoffentlich) von ca. bin durchführen. 3000 Dokumente. Hier
ist ein Beispiel Update:
"query" : {
"_id" : BinData(0,"UKnZwG54kOpT4q9CVWbf4zvdU223lrE5w/uIzXZcObQiAAAA")
},
"updateobj" : {
"$set" : {
"b" : BinData(0,"D8u1Sk/fDES4IkipZzme7j2qJ4oWjlT3hvLiAilcIhU="),
"s" : true
}
}
Dies ist ein typisches Update von denen ich meine Anforderungen sind mit einer Rate von 3000 pro Sekunde eingefügt werden.
Leider sind diese doppelt so lange dauern würde, zum Beispiel das letzte Update für 1723 Dokumente war, und nahm 1061ms.
Die Sammlung hat nur einen Index für die _id, keine anderen Indizes und die durchschnittliche Dokumentgröße für die Sammlung beträgt 244 Byte, ohne Cap.
Der Server verfügt über 64 GB-Speicher, 12 Fäden. Die Insert-Performance ist mit niedrigeren Collections, sagen wir rund 50 Millionen, hervorragend, aber nach etwa 80 Millionen fängt es wirklich an zu fallen.
Könnte es sein, weil der gesamte Satz im Speicher sitzt nicht? Die Datenbank wird durch RAID0-SSDs gesichert, so dass die IO-Performance kein Engpass werden sollte. Wenn dies der Fall war, sollte dies zu Beginn angezeigt werden.
Ich würde mich über einige Hinweise freuen, da ich davon überzeugt bin, dass MongoDB meine eher dürftigen Anforderungen im Vergleich zu einigen Anwendungen erfüllen kann. Es gibt keine substantielle Leserate in der Datenbank, also würde Sharding die Situation nicht verbessern, obwohl ich es vielleicht bin falsch.
So oder so, die aktuelle Einsatzrate ist nicht gut genug.
Update: Hier ist die() nur die Abfrage erklären ...
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "Collection",
"indexFilterSet" : false,
"parsedQuery" : {
"_id" : {
"$eq" : { "$binary" : "SxHHwTMEaOmSc9dD4ng/7ILty0Zu0qX38V81osVqWkAAAAAA", "$type" : "00" }
}
},
"winningPlan" : {
"stage" : "IDHACK"
},
"rejectedPlans" : []
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 1,
"executionTimeMillis" : 1,
"totalKeysExamined" : 1,
"totalDocsExamined" : 1,
"executionStages" : {
"stage" : "IDHACK",
"nReturned" : 1,
"executionTimeMillisEstimate" : 0,
"works" : 2,
"advanced" : 1,
"needTime" : 0,
"needFetch" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"invalidates" : 0,
"keysExamined" : 1,
"docsExamined" : 1
},
"allPlansExecution" : []
},
Die Abfrage es selbst ist sehr schnell, und der Aktualisierungsvorgang dauert etwa 25ish Millisekunden, sie geschoben Mongo werden von Verwendung des BulkWriter: await m_Collection.BulkWriteAsync(updates);
Was ruft aufrufen bei der Abfrage zurück erklären? – CodesInChaos
Vielen Dank für Ihre Hilfe, ich habe die Erläuterungen aus der Abfrage hinzugefügt. – James