MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB:Wie deaktiviere ich die Protokollierung der Warnung:ClientCursor::staticYield kann b/c der rekursiven Sperre nicht entsperren?

Ich habe diesen Fehler kürzlich selbst untersucht, da ich 25 GB pro Monat gesehen habe, die von mongod.log generiert wurden mit ähnlicher Meldung. Ich habe jedoch bemerkt, dass eine Abfrage in der Protokollnachricht enthalten war (ich habe die Nachricht so formatiert, dass sie in diesen Beitrag passt, es war eigentlich alles in einer Zeile):

warning: ClientCursor::yield can't unlock b/c of recursive lock ns: my-database.users top:
{
    opid: 1627436260,
    active: true,
    secs_running: 0,
    op: "query",
    ns: "my-database",
    query:
    {
        findAndModify: "users",
        query: { Registered: false, Completed: 0 },
        sort: { Created: 1 },
        update: { $set: { NextRefresh: "2014-12-07" } },
        new: true
    },
    client: "10.1.34.175:53582",
    desc: "conn10906412",
    threadId: "0x7f824f0f9700",
    connectionId: 10906412,
    locks: { ^: "w", ^my-database: "W" },
    waitingForLock: false,
    numYields: 0,
    lockStats: { timeLockedMicros: {}, timeAcquiringMicros: { r: 0, w: 3 } }
}

Ein bisschen Googeln hat gezeigt, dass diese Meldung am häufigsten ausgelöst wird, wenn die Abfrage keine Indizes verwenden kann. Ich habe versucht, .explain() zu verwenden mit der Abfrage im Log und tatsächlich zeigte sich, dass ein BasicCursor wurde ohne Index verwendet:

db.users.find( { Registered: false, Completed: 0 } ).sort( { Created: 1 } ).explain()
{
    "cursor" : "BasicCursor",
    "isMultiKey" : false,
    "n" : 0,
    "nscannedObjects" : 10453,
    "nscanned" : 10453,
    "nscannedObjectsAllPlans" : 10453,
    "nscannedAllPlans" : 10453,
    "scanAndOrder" : true,
    "indexOnly" : false,
    "nYields" : 1,
    "nChunkSkips" : 0,
    "millis" : 7,
    "indexBounds" : {

    },
    "server" : "mongodb-live.eu-west-1a.10_1_2_213:27017"
}

Das Hinzufügen eines Index für die Elemente in der Abfrage hat das Problem behoben. Das Protokoll wurde nicht mehr generiert und wenn ich .explain() ausführte wieder zeigte es einen verwendeten Index:

{
    "cursor" : "BtreeCursor Registered_1_Completed_1",
    "isMultiKey" : false,
    "n" : 0,
    "nscannedObjects" : 0,
    "nscanned" : 0,
    "nscannedObjectsAllPlans" : 0,
    "nscannedAllPlans" : 1,
    "scanAndOrder" : true,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    "indexBounds" : {
        "Registered" : [
            [
                false,
                false
            ]
        ],
        "Completed" : [
            [
                0,
                0
            ]
        ]
    },
    "server" : "mongodb-live.eu-west-1a.10_1_2_213:27017"
}