Mongodb: 高获取数据库锁
Mongodb: high acquire database lock
我遇到了一个与 MongoDb 性能有关的问题。查询是几十秒,通过命令 db.currentOp()
我可以看到,我所有的查询都在等待数据库锁定。例如:
简单查询
"desc" : "conn36316",
"threadId" : "7420",
"connectionId" : 36316,
"client" : "127.0.0.1:34538",
"active" : true,
"opid" : 197242270,
"secs_running" : 190,
"microsecs_running" : NumberLong(190574655),
"op" : "query",
"ns" : "db.items",
"query" : {
"find" : "items",
"filter" : {
"$msg" : "query not recording (too large)"
}
},
"numYields" : 92,
"locks" : {
"Global" : "r",
"Database" : "r"
},
"waitingForLock" : true,
"lockStats" : {
"Global" : {
"acquireCount" : {
"r" : NumberLong(186)
},
"acquireWaitCount" : {
"r" : NumberLong(1)
},
"timeAcquiringMicros" : {
"r" : NumberLong(24392)
}
},
"Database" : {
"acquireCount" : {
"r" : NumberLong(93)
},
"acquireWaitCount" : {
"r" : NumberLong(53)
},
"timeAcquiringMicros" : {
"r" : NumberLong(60099891)
}
},
"Collection" : {
"acquireCount" : {
"r" : NumberLong(92)
}
}
}
建立索引查询
"desc" : "TTLMonitor",
"threadId" : "12592",
"active" : true,
"opid" : 958,
"op" : "none",
"ns" : "",
"query" : {
},
"numYields" : 0,
"locks" : {
"Global" : "r",
"Database" : "r"
},
"waitingForLock" : true,
"lockStats" : {
"Global" : {
"acquireCount" : {
"r" : NumberLong(4)
}
},
"Database" : {
"acquireCount" : {
"r" : NumberLong(2)
},
"acquireWaitCount" : {
"r" : NumberLong(1)
},
"timeAcquiringMicros" : {
"r" : NumberLong("3571165481")
}
},
"Collection" : {
"acquireCount" : {
"r" : NumberLong(3)
}
}
}
如您所见,等待获取锁需要花费大量时间。对于普通查询等于 60 秒,对于索引等于 3571 秒!
我的工作计算机可以比在服务器上更快地创建类似索引。
我的服务器是虚拟机,10核,40GB内存,磁盘是raid1阵列。
我正在使用 MongoDb 版本 3.2.6 (WiredTiger)。
可能是什么问题?我如何诊断问题?
我的问题是低速磁盘子系统,根据官方文档更换ssd解决了问题
我遇到了一个与 MongoDb 性能有关的问题。查询是几十秒,通过命令 db.currentOp()
我可以看到,我所有的查询都在等待数据库锁定。例如:
简单查询
"desc" : "conn36316",
"threadId" : "7420",
"connectionId" : 36316,
"client" : "127.0.0.1:34538",
"active" : true,
"opid" : 197242270,
"secs_running" : 190,
"microsecs_running" : NumberLong(190574655),
"op" : "query",
"ns" : "db.items",
"query" : {
"find" : "items",
"filter" : {
"$msg" : "query not recording (too large)"
}
},
"numYields" : 92,
"locks" : {
"Global" : "r",
"Database" : "r"
},
"waitingForLock" : true,
"lockStats" : {
"Global" : {
"acquireCount" : {
"r" : NumberLong(186)
},
"acquireWaitCount" : {
"r" : NumberLong(1)
},
"timeAcquiringMicros" : {
"r" : NumberLong(24392)
}
},
"Database" : {
"acquireCount" : {
"r" : NumberLong(93)
},
"acquireWaitCount" : {
"r" : NumberLong(53)
},
"timeAcquiringMicros" : {
"r" : NumberLong(60099891)
}
},
"Collection" : {
"acquireCount" : {
"r" : NumberLong(92)
}
}
}
建立索引查询
"desc" : "TTLMonitor",
"threadId" : "12592",
"active" : true,
"opid" : 958,
"op" : "none",
"ns" : "",
"query" : {
},
"numYields" : 0,
"locks" : {
"Global" : "r",
"Database" : "r"
},
"waitingForLock" : true,
"lockStats" : {
"Global" : {
"acquireCount" : {
"r" : NumberLong(4)
}
},
"Database" : {
"acquireCount" : {
"r" : NumberLong(2)
},
"acquireWaitCount" : {
"r" : NumberLong(1)
},
"timeAcquiringMicros" : {
"r" : NumberLong("3571165481")
}
},
"Collection" : {
"acquireCount" : {
"r" : NumberLong(3)
}
}
}
如您所见,等待获取锁需要花费大量时间。对于普通查询等于 60 秒,对于索引等于 3571 秒!
我的工作计算机可以比在服务器上更快地创建类似索引。
我的服务器是虚拟机,10核,40GB内存,磁盘是raid1阵列。
我正在使用 MongoDb 版本 3.2.6 (WiredTiger)。
可能是什么问题?我如何诊断问题?
我的问题是低速磁盘子系统,根据官方文档更换ssd解决了问题