2015-07-08 5 views
17

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);

+0

Was ruft aufrufen bei der Abfrage zurück erklären? – CodesInChaos

+1

Vielen Dank für Ihre Hilfe, ich habe die Erläuterungen aus der Abfrage hinzugefügt. – James

Antwort

11

Leistung können Sie versuchen, die Write concern levels zu ändern. Offensichtlich besteht hier ein Risiko, da Sie keinen Schreibfehler finden können, aber zumindest sollten Sie dennoch Netzwerkfehler erfassen können. Da MongoDB die Bulk-Einfügeoperationen in groups of 1000 gruppiert, sollte diese den Prozess beschleunigen.

W ist standardmäßig 1:

enter image description here

Wenn Sie es ändern zu 0:

enter image description here

Wenn Sie nicht Sorge über die Reihenfolge der Elemente sind, können Sie gewinnen Sie etwas Geschwindigkeit, indem Sie den ungeordneten Massenbetrieb aufrufen

await m_Collection.BulkWriteAsync(updates, new BulkWriteOptions() { IsOrdered = false }); 

Mit einer ungeordneten Operationsliste kann MongoDB parallel die Schreiboperationen in der Liste und in beliebiger Reihenfolge ausführen. Link

+0

Vielen Dank für Ihre Eingabe, Sie haben zwei Elemente markiert, die ich dachte, wurden standardmäßig eingestellt! Ich hatte WriteConcern angeschaut und las die Dokumentation als Standard auf den zweiten Typ. Ich werde diese Änderung natürlich vornehmen, ich bin glücklich darüber, dass die Daten im Speicher sind, da sie fehlertolerant sind. Was IsOrdered betrifft, nahm ich an, dass das immer falsch war und auf True gesetzt werden musste? Große Offenbarung, da ich meine Einsätze parallel möchte, deshalb verwende ich BulkWrite !! Ich werde mit meinen Ergebnissen berichten, vielen Dank. – James

+0

Wenn Sie sich die BulkWriteOptions in ILSpy ansehen, sind Sie richtig, das IsOrdered-Flag ist standardmäßig true. Dies ist sehr nicht intuitiv, aber sehr hilfreich zu wissen. – James

+0

Bitte halten Sie uns über die Zunahme der Einsätze pro Sekunde, die die Frage bearbeiten, auf dem Laufenden. –

-1

Wir wechselten zu Cassandra weil Mongo nicht gut skalierbar. Wenn Sie sagen, dass Sie nach 80M eine Leistungsverschlechterung gesehen haben, ist es leicht mit dem Speicher verbunden. Ich bin mehr Experte für SQL-DBs, aber ich würde nicht sagen, dass 25ms für ein Non-Key-Feld-Update beeindruckend ist. Ich vermute, dass ein ähnliches Update würde besser auf Oracle, MySql, ...

+0

Vielen Dank für Ihre Eingabe, ich habe Mongo-Instanzen mit vielen hundert Millionen Schlüsseln ohne Probleme umgehen sehen, also bin ich sicher, dass ich etwas falsch mache. Mongo hat in der Vergangenheit sehr viel mit diesem Arbeitspensum zu tun gehabt, jetzt, wo es skaliert wird, stoße ich auf Probleme, für die ich sicher Lösungen finden werde. – James

0

„Es gibt keine wesentliche Leserate auf der Datenbank so Sharding würde Angelegenheiten, die nicht verbessern, wenn auch vielleicht ich falsch bin.“

Ein Update beinhaltet einen Lesevorgang. aka finden, dass verlassen _id - also vielleicht sharding könnte hilfreich sein, wenn nicht v hilfreich