如何诊断周期性 MongoDB 减速?

How to diagnose periodic MongoDB slowdown?

我们的 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 似乎没有 much/any 文档,所以我不明白这个日志条目是什么意思。 r 指的是什么?

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

By default, the server will automatically close the cursor after 10 minutes of inactivity, or if client has exhausted the cursor.

那是说您可能有一些断开的连接并且正在进行清理 - 或者其他 disk/system 维护工作可能同时在进行 window。

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

killCursor 参考:manual

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

得到一个想法