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
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 ...
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.
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