2012-09-12 5 views
9

Ich sehe eine große (~ 200 ++) Fehler/s Zahl in meinem mongostat Ausgang, wenn auch sehr niedrige Sperre%:Mongo aus einer riesigen Anzahl von Fehlern leiden

enter image description here

Meine Mongo-Server auf m1.large Instanzen auf der amazon-Cloud ausgeführt wird, so dass jeder sie haben 7.5GB RAM ::

root:~# free -tm 
      total  used  free  shared buffers  cached 
Mem:   7700  7654   45   0   0  6848 

klar, ich habe nicht genügend Speicher für alle cahing mongo tun will (was, btw, führt aufgrund der Festplatten-IO zu einer enormen CPU-Auslastung von%.

Ich fand this document, dass schlägt vor, dass in meinem Szenario (hoher Fehler, niedrige Sperre%), ich "Lesevorgänge" und "mehr Datenträger IOPS."

Ich suche Ratschläge, wie Sie das am besten erreichen. Es gibt nämlich viele potentielle Abfragen, die von meiner node.js-Anwendung ausgeführt werden, und ich bin mir nicht sicher, wo der Engpass stattfindet. Natürlich habe ich versucht

db.setProfilingLevel(1); 

Doch diese mir nicht so viel hilft, weil die ausgegebenen Statistiken mir langsame Abfragen nur zeigen, aber ich habe eine harte Zeit, diese Informationen zu übersetzen, in die Abfragen sind die Seitenfehler verursachen ...

Wie Sie sehen können, ist dies in einer riesigen (fast 100%) CPU-Wartezeit auf meinem primären mongo-Server führt, obwohl der 2x sekundäre Server nicht betroffen ist ...

enter image description here

Hier ist, was die Mongo Docs müssen über Seitenfehler sagen:

Seitenfehler geben an, wie oft MongoDB Daten benötigt, die sich nicht im physischen Speicher befinden und aus dem virtuellen Speicher gelesen werden müssen. Um nach Seitenfehlern zu suchen, lesen Sie den Wert extra_info.page_faults im Befehl serverStatus. Diese Daten sind nur auf Linux-Systemen verfügbar.

Allein, Seitenfehler sind geringfügig und vollständig schnell; Aggregierte Seitenfehler weisen jedoch in der Regel darauf hin, dass MongoDB zu viele Daten von der Festplatte liest und eine Reihe zugrunde liegender Ursachen und Empfehlungen angeben kann. In vielen Situationen werden die Lesesperren von MongoDB nach einem Seitenfehler "nachgeben", damit andere Prozesse lesen und Blockierungen vermeiden können, während sie darauf warten, dass die nächste Seite in den Speicher eingelesen wird. Dieser Ansatz verbessert die Nebenläufigkeit, und in Systemen mit hohem Volumen verbessert dies auch den Gesamtdurchsatz.

Wenn möglich, kann die Erhöhung der für MongoDB verfügbaren RAM-Menge die Anzahl der Seitenfehler reduzieren. Wenn dies nicht möglich ist, sollten Sie in Erwägung ziehen, einen Shard-Cluster bereitzustellen und/oder einen oder mehrere Shards zu Ihrer Bereitstellung hinzuzufügen, um die Last auf mongod-Instanzen zu verteilen.

Also habe ich versucht, den empfohlenen Befehl, der schrecklich wenig hilfreich ist:

PRIMARY> db.serverStatus().extra_info 
{ 
    "note" : "fields vary by platform", 
    "heap_usage_bytes" : 36265008, 
    "page_faults" : 4536924 
} 

Natürlich konnte ich den Server Größe (mehr RAM) erhöhen, aber das ist teuer und scheint übertrieben zu sein. Ich sollte Sharding implementieren, aber ich bin mir nicht sicher, welche Sammlungen Sharding benötigen! Daher brauche ich einen Weg, um zu lokalisieren, wo die Fehler auftreten (welche spezifischen Befehle verursachen Fehler).

Danke für die Hilfe.

+1

Ich weiß, das ist eine alte Frage, aber ein paar Dinge springen heraus. Nachdem Sie 'db.setProfilingLevel (1)' gesetzt haben, müssen Sie diese Abfragen ausführen und 'explain()' auf ihnen ausführen. Wahrscheinlich verwenden diese Abfragen keine Indizes und führen vollständige Sammlungsscans durch. Ihre Secondaries, die sich im Leerlauf befinden, sind ein weiterer Grund zur Sorge, abhängig von Ihrer Anwendungseinstellung. "SlaveOk = true" kann dabei helfen, die Secondaries zu entlasten. Ich würde jedoch sicherstellen, dass Ihre Indizes zuerst in Ordnung sind, oder Sie verbreiten das Elend nur auf die Secondaries. – hwatkins

Antwort

6

Wir wissen nicht wirklich, wie Ihre Daten/Indizes aussehen.

Noch eine wichtige Regel der MongoDB-Optimierung:
Stellen Sie sicher, dass Ihre Indizes in RAM passen. http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-MakesureyourindexescanfitinRAM.

Berücksichtigen Sie, je kleiner Ihre Dokumente sind, desto höher ist Ihr Schlüssel/Dokumenten-Verhältnis und desto höher muss Ihr RAM/Disksize-Verhältnis sein.

Wenn Sie Ihr Schema ein wenig anpassen können, um einige Daten zusammenzufassen und die Anzahl der benötigten Schlüssel zu reduzieren, könnte das hilfreich sein.

+0

Es scheint, dass ich den Teil auf "einen Index pro Abfrage" verpasst habe. Ich war auch ziemlich übereifrig mit meiner Verwendung von Indizes um mein Schema herum, weil mir die Einschränkung "muss in RAM passen" nicht bewusst war. Kurze Frage zur Indizierung von Best Practices: Wenn ich eine Abfrage ausführe, die auch eine sort() - oder limit() -Option verwendet, sollte ich diese Felder indizieren? Wie wäre es, wenn ich Abfragen habe, die nach mehreren Bedingungen suchen (zB {'age': 30, 'name': y}, gibt es eine gute Möglichkeit zu entscheiden, welche der beiden Spalten (beide?) Indiziert werden soll? –

+0

auch - Nachdem ich db.XX.dropIndexes() ausgeführt habe, muss ich irgendetwas tun, um Ressourcen wiederherzustellen/Seitenfehler auf meinem mongo Server zu stoppen? Ich habe alle meine Indizes fallen gelassen und auf eine viel konservativere Weise neu indiziert, aber ich sehe nichts noch keine Verbesserung –

+0

Wie für Ihre erste Frage.Es ist schwierig, diese Dinge allgemein zu beantworten.Dies sind die ständigen Fragen, die wir fragen und Kompromisse, die wir mit Schemadesign. Für zusammengesetzte Indizes, wenn Sie Feld A oder A, B oder suchen A, B, C dann können Sie einen zusammengesetzten Index für [A, B, C] erstellen.Wenn Sie dann auf B oder C suchen, wird es Ihnen nicht helfen. Http://www.mongodb.org/display/DOCS/Indexe # Indexes-CompoundKeys – z5h

Verwandte Themen