Нашему серверу 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"})
Добавление индекса должно улучшить производительность этой операции. В настоящее время выполняется сканирование коллекции; использование индекса будет намного эффективнее.
Команда createIndex неверна. Должно получиться следующее:
db.users.createIndex({ clientSN:1, status:1}, { background : true } )
Обратите внимание, что по умолчанию индексы создаются на переднем плане, поэтому установка флага задний план очень важна.