我正在使用MongoDB(3.0)和3台服务器的副本集。我从一周开始经历非常慢的查询,并且我试图找出我服务器上的错误。
通过使用db.currentOp()
命令,我可以看到,当一个"复制工作者"在跑。所有查询都在等待锁定("waitingForLock" : true
),似乎复制工作者已经执行了此锁定并且正在运行几分钟(看起来很长)。
为了更具体地说明我的用户案例,我在副本集中有多个数据库,所有这些数据库包含相同的集合但数据量不同(我为每个客户端使用一个数据库)。
我使用WiredTiger作为存储引擎,通常(正如文档声明的那样)不使用全局锁。所以我期望在更新此集合时对特定集合的查询会很慢,但我并不期望所有查询都很慢或被阻止。
有没有人遇到过同样的问题?当进程在数据库中写入时执行读取时,MongoDB是否存在一些限制?
此外,有没有办法告诉MongoDB我不关心读操作的一致性(为了避免锁定)?
感谢。
更新:
通过重新启动服务器,问题就消失了。内存和CPU的使用量似乎在增长(但仍然非常低),这会导致复制过程缓慢,从而导致锁定并阻止查询执行。
我仍然不明白为什么我们在这个数据库上遇到了问题。也许版本3.0.9有一个错误(我将升级到3.0.12)。数据库还需要一个月才能非常慢,只需重新启动所有服务器即可解决问题。我们的工作量主要是写入(使用findAndModify)。有没有人知道Mongo中的一个错误,即密集写入会导致性能随着时间的推移而降低?