我们的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。
答案 0 :(得分:0)
默认情况下,服务器将在10分钟不活动后自动关闭光标,或者客户端已用尽光标。
这就是说你可能有一些掉线连接并且正在进行清理 - 或者其他磁盘/系统维护工作可能在同一时间窗口进行。
要诊断性能下降根本原因 - 您可以观察mongo top输出,检查磁盘和内存使用情况,并查看哪个特定区域存在尖峰。
killCursor参考:manual
答案 1 :(得分:0)
r 是意图共享(IS)锁定。 Killcursors不是问题所在。您可能需要深入挖掘才能找到实际问题。检查索引。解释您的API正在使用的所有查询。 您可以从https://groups.google.com/forum/#!msg/mongodb-user/qc4AD7kqu4U/7kaI1zwaAwAJ
获得一个想法