我正在尝试调试MongoDB实例上的高CPU问题。我们有两个分片r3.large AWS实例。与操作数相比,没有太多的页面错误。

系统配置文件显示了大量的getmore条目,如下所示。请帮助我找出导致getmore变慢的原因。

    {
        "op" : "getmore",
        "ns" : "mydb.mycollection",
        "cursorid" : 74493486271,
        "ntoreturn" : 0,
        "keyUpdates" : 0,
        "numYield" : 7,
        "lockStats" : {
            "timeLockedMicros" : {
                "r" : NumberLong(16140),
                "w" : NumberLong(0)
            },
            "timeAcquiringMicros" : {
                "r" : NumberLong(6458801),
                "w" : NumberLong(294321)
            }
        },
        "nreturned" : 120,
        "responseLength" : 13100,
        "millis" : 6304,
        "execStats" : {

        },
        "ts" : ISODate("2015-06-16T14:20:39.886Z"),
        "client" : "1.5.1.3",
        "allUsers" : [ ],
        "user" : ""
    }

最佳答案

回答我自己的问题可能会对其他人有所帮助。

  • 重置为logLevel:0(默认值)后,在CPU处于高db.adminCommand( { setParameter: 1, logLevel: 1 } )时启用更多日志记录。
  • 然后,日志显示了一个0毫秒的汇总查询,但此后,5到6秒钟获得了更多条目。
  • 聚合查询的cursor: { batchSize: 0 }的初始批处理大小为零。因此,查询将快速返回。但是,当应用程序开始通过游标迭代时,就会记录getmore,并且该条目没有任何查询详细信息。

    修复聚合查询$ match以使用索引解决了问题
  • 10-06 01:47