2013-08-26 6 views

risposta

17

l'approccio equivalente in MongoDB sarebbe quella di utilizzare il query profiler per monitorare e diagnosticare domande lente.

Con la creazione profili abilitata per un database, le operazioni lente vengono scritte nella raccolta limitata system.profile (che per impostazione predefinita ha una dimensione di 1 Mb). È possibile regolare la soglia per le operazioni lente (per impostazione predefinita 100 ms) utilizzando slowms parameter.

+0

grazie Stennie! Soprattutto per il collegamento dex :) – DmitrySemenov

+0

oppure è possibile effettuare le seguenti operazioni: mongo localhost: 27017 e scrivere nella console db.setProfilingLevel (2,10) - questo stamperà nel registro tutte le query che hanno richiesto più di 10 ms per eseguire – Bestmacros

+0

@Bestmacros sì, questo è il "query profiler" suggerito nella risposta. – Madbreaks

6

È possibile utilizzare le seguenti due opzioni di modem. La prima opzione non query non utilizzano indice (V 2.4 solo), il secondo record interrogazioni più lento di una soglia ms (default è 100 ms)

--notablescan 

Forbids operations that require a table scan. 

--slowms <value> 

Defines the value of “slow,” for the --profile option. The database logs all slow queries to the log, even when the profiler is not turned on. When the database profiler is on, mongod the profiler writes to the system.profile collection. See the profile command for more information on the database profiler. 
+0

Quindi, nel caso --notablescan fornito - l'interrogazione verrà respinta da mongod? Verrà registrato nella raccolta system.profile? – DmitrySemenov

+0

In caso di '--notablescan' verrà restituito un errore e nel log verrà visualizzato qualcosa come' query query db.coll: {whatever} ntoreturn: 0 keyUpdates: 0 eccezione: scansioni di tabelle non consentite: db. coll' –

+1

Nota che dovresti usare solo {{--notablescan}} in un ambiente di sviluppo. Esistono molte semplici attività di amministrazione che richiedono scansioni di tabelle (ad esempio, visualizzare un elenco di raccolte o aggiornare campi non indicizzati), pertanto l'attivazione di questa opzione può avere conseguenze impreviste. – Stennie

-4

Mentre ovviamente è possibile utilizzare Profiler, una funzionalità molto accurata di Mongo DB, a causa della quale mi innamoro veramente di Mongo DB MMS. Richiede meno di 60 secondi e può gestire da qualsiasi luogo. Sono sicuro che lo amerai. https://mms.mongodb.com/

11

In primo luogo, è necessario impostare il profilo, specificando il livello di registro desiderato. Le 3 opzioni sono:

  • 0 - logger off
  • 1 - log query lente
  • 2 - log tutte le query

si esegue questa operazione eseguendo il mongod demone con le --profile opzioni:

mongod --profile 2 --slowms 20

Con questo, l'l OGS sarà scritto alla raccolta system.profile, su cui è possibile eseguire query come segue:

  • trovare tutti i registri in qualche collezione, ordinando da timestamp ascendente:

db.system.profile.find({ ns:/<db>.<collection>/ }).sort({ ts: 1 });

  • cercando per i registri di query con più di 5 millisecondi:

db.system.profile.find({millis : { $gt : 5 } }).sort({ ts: 1});

2

È possibile utilizzare lo strumento da riga di comando mongotail per leggere il registro dal profiler all'interno di una console e con un formato più leggibile.

Prima attivare il profiler e impostare la soglia in millisecondi affinché il profilo consideri un'operazione lenta.Nel seguente esempio la soglia è fissata a 10 millisecondi per un database denominato "vendite":

$ mongotail sales -l 1 
Profiling level set to level 1 
$ mongotail sales -s 10 
Threshold profiling set to 10 milliseconds 

Poi, per vedere in "tempo reale" le query lente, con alcune informazioni extra, come il tempo di ogni query ha preso, o quanti registri ha bisogno di "camminare" per trovare un particolare risultato:

$ mongotail sales -f -m millis nscanned docsExamined 
2016-08-11 15:09:10.930 QUERY [ops] : {"deleted": {"$exists": false}, "prod_id": "367133"}. 8 returned. nscanned: 344502. millis: 12 
2016-08-11 15:09:10.981 QUERY [ops] : {"deleted": {"$exists": false}, "prod_id": "367440"}. 6 returned. nscanned: 345444. millis: 12 
.... 
+0

Bel strumento! Sono stato in grado di configurarlo rapidamente e ottenere alcuni buoni benchmark con una copia locale del database di produzione. –

0

Nel caso in cui qualcuno finisce qui da Google su questa vecchia domanda, ho scoperto che explain davvero mi ha aiutato a risolvere domande specifiche che mi potrebbe vedere stavano causando COLLSCAN s dai registri.

Esempio:

db.collection.find().explain()

Questo ti consente di sapere se la query utilizza un COLLSCAN (Base Cursore) o un index (BTree), tra le altre cose.

https://docs.mongodb.com/manual/reference/method/cursor.explain/