2016-01-22 9 views
7

Gemäß Docker-Container-Statistiken verbraucht meine Mongo-Datenbank konstant zwischen 250 und 350% CPU. Das ist ziemlich beeindruckend, da es ein Single-Core-System ist: PMongoDB konstant hohe CPU-Auslastung

Der traurige Teil ist, dass dies meine Produktionsinstanz ist und viel trauriger ist, dass es bis zum nächsten Prod-Backup leben muss und das sind noch 3,5 Stunden.

Ich habe versucht, ein Mongotop zu machen, aber es sagt mir 0ms Statistiken für alle gezeigten Sammlungen. Kann ich etwas anderes tun, um herauszufinden, was vor sich geht?

PS: Die db ist für 9 Wochen und hat keine Probleme verursacht.

+0

und das zeigt die htop? – alex10

Antwort

13

Es gibt eine Funktion namens db.currentOp(), die die aktuell laufenden Abfragen mit sehr detaillierten Informationen auflistet, sie enthält auch die Dauer, in der sie ausgeführt wurden (secs_running).

Sie können dann die currentOp.opid mit db.killOp() verwenden, um diese Abfrage/Operation zu beenden.

Wenn db.currentOp() keine Ergebnisse zurückgibt, weil es keine Abfrage gibt, die Verwüstung verursacht hat, gibt es auch db.setProfilingLevel(), die das Profiling durch das Speichern von Abfragen in der "lokalen" Datenbank aktiviert. Here ist ein "Tutorial", das aus dem "M102: MongoDB for DBAs" Kurs stammt.

+0

Danke für Ihre Antwort! Die Ausgabe ist '{" inprog ": []}' :( – nxrd

+0

Ich denke, es gibt eine Art von Protokollierung, die Sie aktivieren können, die dann Abfragen speichert, die eine ungewöhnlich lange Zeit in der "lokalen" Datenbank benötigen ein Blick, wenn ich mehr Informationen dazu finde .. –

+0

Info über db.setProfilingLevel() –

13

Die erste und wichtigere Meinung, die Sie tun müssen, ist Ihre Art von Abfragen zu überprüfen, zum Beispiel in meinem Fall habe ich das gleiche Problem und wenn ich meine Protokolle überprüfen tail -f /var/log/mongodb/mongod.log (Sie können diese Protokolle konfigurieren/etc/mongod .conf). Ich habe nur einfache Abfragen wie db.brands.find ({"field": "value"}) gesehen, aber ich überprüfe meine Indizes in "marks" -Ansammlungen und dieses Feld für Abfragen ist kein Index (db.brands.getIndexes()) der einzige Gedanke, den ich gemacht habe, indizieren dieses Feld db.brands.ensureIndex({name:1},{unique:true}) natürlich sicher, wenn Ihr Feld ist einzigartig, weil in diesem Beispiel ich als einzigartig. Danach wechselte meine CPU von 100% auf 20%.

Also ich sage nicht, dass Ihr Problem ist, aber könnte sein, überprüfen Sie Ihre Abfragen, bevor einige größte denken.

+0

Das war die richtige Antwort für mich. Auf eine konstante CPU-Auslastung von 95-98% reduziert, obwohl die kleinste Azure VM verwendet wird – fillobotto