我有一个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?我该怎么做才能减少它?
什么是
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容量存在实际限制).
| 归档时间: |
|
| 查看次数: |
7416 次 |
| 最近记录: |