如何诊断定期的MongoDB减速?

时间:2016-05-18 10:26:07

标签: mongodb mongodb-.net-driver

我们的Mongo数据库定期(有时​​每天一次)减慢约30-40分钟。访问数据库的API在这个缓慢的时期内每隔5-10分钟就会出现高延迟的峰值。

查看mongod日志文件,这两行显示在缓慢开始时,并且与每个API延迟峰值共存(我已将json格式化为可读性):

killcursors  keyUpdates:0 numYields:0 locks(micros) r:91 4157ms
serverStatus was very slow: { 
   after basic: 0, 
   after asserts: 0, 
   after backgroundFlushing: 0, 
   after connections: 0, 
   after cursors: 0, 
   after dur: 0, 
   after extra_info: 0, 
   after globalLock: 0, 
   after indexCounters: 0, 
   after locks: 0, 
   after network: 0, 
   after opcounters: 0, 
   after opcountersRepl: 0, 
   after recordStats: 2359, 
   after repl: 2359, 
   at end: 2359 
}

查询在这些之后被记录,因为它们需要几秒钟 - 比正常情况慢得多。

killCursors似乎没有太多/任何文档,所以我不明白这个日志条目的含义。 r指的是什么?

killCursors命令是否需要很长时间才能执行,因为有大量打开的游标需要清理?据我所知,我们的应用程序代码中没有任何内容明确地杀死游标,这是正常的工作吗?它经常被记录,但通常需要20-120ms。

2 个答案:

答案 0 :(得分:0)

  

默认情况下,服务器将在10分钟不活动后自动关闭光标,或者客户端已用尽光标。

这就是说你可能有一些掉线连接并且正在进行清理 - 或者其他磁盘/系统维护工作可能在同一时间窗口进行。

要诊断性能下降根本原因 - 您可以观察mongo top输出,检查磁盘和内存使用情况,并查看哪个特定区域存在尖峰。

killCursor参考:manual

答案 1 :(得分:0)

r 是意图共享(IS)锁定。 Killcursors不是问题所在。您可能需要深入挖掘才能找到实际问题。检查索引。解释您的API正在使用的所有查询。 您可以从https://groups.google.com/forum/#!msg/mongodb-user/qc4AD7kqu4U/7kaI1zwaAwAJ

获得一个想法