Mongodb读锁

Bor*_*Mik 6 mongodb

我有一个mongodb集合,包含自定义_id和500M +文档._id索引的大小是≈25Gb,整个集合是≈125Gb.服务器有96 Gb RAM.读取活动仅是_id的范围查询.Explain()显示查询使用索引.Mongo在负载测试开始后一段时间内工作得相当快,并且在一段时间后变慢.我可以在日志中看到很多这样的条目:

[conn116] getmore csdb.archive query:{_ id:{$ gt:2812719756651008,$ lt:2812720361451008}} cursorid:444942282445272280 ntoreturn:0 keyUpdates:0 numYields:748 locks(micros)r:7885031 nreturned:40302 reslen:1047872 10329ms

一段db.currentOp():

"waitingForLock" : false,
                        "numYields" : 193,
                        "lockStats" : {
                                "timeLockedMicros" : {
                                        "r" : NumberLong(869051),
                                        "w" : NumberLong(0)
                                },
                                "timeAcquiringMicros" : {
                                        "r" : NumberLong(1369404),
                                        "w" : NumberLong(0)
                                }
                        }
Run Code Online (Sandbox Code Playgroud)

什么是锁(微)r?我该怎么做才能减少它?

Wah*_*nto 6

什么是locks(micros) r

读取锁定的时间量(以微秒为单位).

  • R - 全局读锁定
  • W - 全局写锁定
  • r - 数据库特定的读锁定
  • w - 数据库特定的写锁定

我该怎么做才能减少它?

  • 分片如何影响并发?

    分片通过在多个mongod实例上分发集合来提高并发性,允许分片服务器(即mongos进程)同时对各种下游mongod实例执行任意数量的操作.

  • 诊断性能问题(锁)

    MongoDB使用锁定系统来确保数据集的一致性.但是,如果某些操作长时间运行,或者队列形成,则性能将随着请求和操作等待锁定而变慢.与锁相关的减速可能是间歇性的.要查看锁是否影响了您的性能,请查看输出globalLock部分中的数据serverStatus.如果globalLock.currentQueue.total一直很高,那么大量请求有可能等待锁定.这表明可能会影响性能的并发问题.

    如果globalLock.totalTime相对于正常运行时间较高,则数据库在锁定状态下存在很长时间.如果globalLock.ratio也很高,MongoDB可能已经处理了大量长时间运行的查询.长查询通常是许多因素的结果:索引的无效使用,非最佳模式设计,较差的查询结构,系统架构问题或RAM不足导致页面错误和磁盘读取.

  • 我们如何扩展MongoDB(垂直)

    遗憾的是,MongoDB本身通常会在服务器容量耗尽之前成为瓶颈.写锁定几乎总是最大的问题(尽管单个MongoDB进程可以利用多少IO容量存在实际限制).