2016-05-18 32 views
2

我们的Mongo数据库定期(有时​​每天一次)减速大约30-40分钟。访问数据库的API遇到这种缓慢时期每5-10分钟发生的高延迟峰值。如何诊断周期性MongoDB减速?

望着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。

回答

0

默认情况下,服务器会在闲置10分钟后自动关闭游标,或者如果客户端已用尽游标。

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

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

killCursor参考:manual

+0

感谢链接到Cursors页面 - 我今天早上正在寻找并找不到它。但是这实际上并没有提到'killCursors'。如果下次发生这种情况,我会看看是否可以跳箱,然后运行“mongotop”和“mongostat”... –