MongoDB 3.6 ClientCursor :: staticYield не может разблокировать b / c рекурсивной блокировки ns: - PullRequest
0 голосов
/ 30 апреля 2018

На нашем сервере prod mongo не хватает памяти с чрезмерным ведением журнала нижеприведенного оператора

2018-03-19T20:03:05.627-0500 [conn2] warning: ClientCursor::staticYield can't unlock b/c of recursive lock ns:

    top:{  
       opid:16,
       active:true,
       secs_running:0,
       microsecs_running:254,
       op:"query",
       ns:"users.person",
       query:{  
          findandmodify:"person",
          query:{  
             clientSN:"405F014DE02B33F1",
             status:"New"
          },
          update:{  
             $set:{  
                status:"InProcess"
             },
             $currentDate:{  
                lastUpdateTime:true
             }
          },
          new:true
       },
       client:"10.102.26.26:61299",
       desc:"conn2",
       connectionId:2,
       locks:{  
          ^:"w",
          ^users:"W"
       },
       waitingForLock:false,
       numYields:0,
       lockStats:{  
          timeLockedMicros:{  

          },
          timeAcquiringMicros:{  
             r:0,
             w:1070513
          }
       }
    }

Я проверил MongoDB: Как отключить ведение журнала предупреждения: ClientCursor :: staticYield не может разблокировать b / c рекурсивной блокировки? , что указывает на то, что причиной проблемы является отсутствие индексов.

Я попытался выполнить запрос с помощью explain() в соответствии с приведенной выше статьей, и ниже вывод db.getCollection('personSync').find({"clientSN":"405F014DE02B33F1","status":"New"}).explain() запроса, который имеет поля выше findandmodify операция

{
    "cursor" : "BasicCursor",
    "isMultiKey" : false,
    "n" : 0,
    "nscannedObjects" : 71331,
    "nscanned" : 71331,
    "nscannedObjectsAllPlans" : 71331,
    "nscannedAllPlans" : 71331,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 557,
    "nChunkSkips" : 0,
    "millis" : 59,
    "server" : "SQL01:27017",
    "filterSet" : false,
    "stats" : {
        "type" : "COLLSCAN",
        "works" : 71333,
        "yields" : 557,
        "unyields" : 557,
        "invalidates" : 0,
        "advanced" : 0,
        "needTime" : 71332,
        "needFetch" : 0,
        "isEOF" : 1,
        "docsTested" : 71331,
        "children" : []
    }
} 

, поэтому я ссылался на статью https://docs.mongodb.com/manual/reference/method/db.collection.createIndex/, чтобы создать индекс, решит ли добавление индекса ниже способ устранения моей проблемы для операции findandmodify в моем случае? Или мне нужно добавить еще индексы?

db.users.createIndex({ clientSN:"405F014DE02B33F1", status:"New"})

1 Ответ

0 голосов
/ 03 мая 2018

Добавление индекса должно улучшить производительность этой операции. В настоящее время он выполняет сканирование коллекции; использование индекса будет намного более эффективным.

Команда createIndex неверна. Должно быть следующее:

db.users.createIndex({ clientSN:1, status:1}, { background : true } )

Обратите внимание, что индексы по умолчанию создаются на переднем плане, поэтому установка флага background очень важна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...