Mongodb高CPU - 特殊虚拟集合db上的许多慢查询。$ cmd

时间:2015-06-05 15:36:18

标签: performance mongodb mongodb-query

在诊断高CPU mongodb时,我们发现了很多慢(6-7秒)的查询。所有这些都与“ns”有关:“mydb。$ cmd”。

慢查询条目如下所示:

{
"_id" : ObjectId("5571b739f65f7e64bb806362"),
"op" : "command",
"ns" : "mydb.$cmd",
"command" : {
    "aggregate" : "MyCollection",
    "pipeline" : [ 
        {
            "$mergeCursors" : [ 
                {
                    "host" : "abc:27005",
                    "id" : NumberLong(82775337156)
                }
            ]
        }
    ]
},
"keyUpdates" : 0,
"numYield" : 0,
"lockStats" : {
    "timeLockedMicros" : {
        "r" : NumberLong(12),
        "w" : NumberLong(0)
    },
    "timeAcquiringMicros" : {
        "r" : NumberLong(2),
        "w" : NumberLong(2680)
    }
},
"responseLength" : 12312,
"millis" : 6142,
"execStats" : {},
"ts" : ISODate("2015-06-05T12:35:40.801Z"),
"client" : "1.1.1.1",
"allUsers" : [],
"user" : ""

}

我们不确定导致这些查询的代码部分是什么。我们该如何继续查找/调试导致这些$ cmd慢查询的应用程序的查询?

2 个答案:

答案 0 :(得分:1)

这些日志实际上是针对指定数据库运行command时发出的查询(在您的情况下为mydb)。因此,这只是针对MongoDB运行的一些聚合命令。

如果您的应用程序没有直接执行此操作,则会出现(如http://dbattish.tumblr.com/post/108652372056/joins-in-mongodb中所述)从v2.6使用$ mergecursors变量来跨分片合并查询。

答案 1 :(得分:-1)

我的测试显示MongoDB在处理并发请求时总是使用~90-100%的CPU。这是因为我转向MySQL。使用简单查询的我的应用程序使用MySQL工作速度提高了3倍,而且我使用的CPU更少。我很快就会通过全面测试来创造一个艺术品。现在,只需查看MongoDB和MariaDB的CPU使用率,即X = 5,10,25,50,100,500,1000并发连接的查询。

siege -b -cX -t1M url

据我所知,高CPU使用率与高CPU使用率无关。我的意思是,即使是非常简单的并发请求查询也会使MongoDB使用100%的CPU。

所有使用1vCPU和1Gb内存且连接池大小为10的测试

MongoDB的

enter image description here

的MySQL

enter image description here

我使用不同的配置(4vCPU,6G内存)进行了很多测试,并且MongoDB总是使用比MySQL更多的CPU。您可以尝试使用MongoDB:

  1. 更改连接循环大小。我希望你不要打开每个查询的连接。
  2. 您使用的是猫鼬吗?尝试使用Native Nodejs MYSQL驱动程序 - 它要快得多。
  3. 我对MongodDB读取数据非常失望。不仅MySQL使用更少的CPU,它总是至少快3倍!