На нашем сервере 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"})