MongoDB 3.6 ClientCursor :: staticYield не может разблокировать b / c рекурсивной блокировки ns:

Нашему серверу 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"})
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
192
1

Ответы 1

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

Команда createIndex неверна. Должно получиться следующее:

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

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

Другие вопросы по теме