2015-06-05 70 views
1

在診斷高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慢查詢的查詢?

回答

-1

我的測試顯示,MongoDB在處理併發請求時總是使用〜90-100%的CPU。這是因爲我轉移到MySQL。我使用thame簡單查詢的應用程序使用MySQL的速度提高了3倍,我使用的CPU也少得多。我將很快通過全面測試創建一個artciel。現在,查看X = 5,10,25,50,100,500,1000個併發連接的查詢的MongoDB和MariaDB的CPU使用情況。

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是使用更多的CPU,然後MySQL。你可以嘗試使用MongoDB的是:

  1. 更改連接循環大小。我希望你不要打開每個查詢的連接。
  2. 你在使用貓鼬嗎?嘗試使用Native Nodejs MYSQL驅動程序 - 它要快得多。

我非常失望MongodDB的閱讀數據。不僅如此,MySQL使用更少的CPU,它總是至少快3倍!

+0

OP沒有要求比較MongoDB和MySQL。 –

1

這些日誌實際上是運行command對指定的數據庫(你的情況MYDB)時發出的查詢。因此,這只是針對您的MongoDB運行的一些聚合命令。

如果您的應用程序沒有直接執行此操作,則會出現(如http://dbattish.tumblr.com/post/108652372056/joins-in-mongodb中所述)$ mergecursors變體在v2.6中使用,以跨越分片合併查詢。

+0

謝謝彼得。我們怎樣才能找到哪個查詢導致了這個命令? – Samba

+0

@Samba:我目前不使用蒙戈V2.6,所以不能瑞普這一點,說不準。然而,看起來與文章,在該命令的ID事實上是一個遊標ID。你可以找到相應的光標早前在日誌引用,然後看看查詢參數和客戶的詳細資料,以追查? –