2016-01-22 193 views
7

根據碼頭的容器統計,我的mongo數據庫消耗250至350%CPU不斷。這是非常令人印象深刻的,因爲它是一個單一的核心繫統:PMongoDB持續高CPU使用率

可悲的是,這是我的生產實例,更令人難過的是,它必須活到下一個產品備份,並且還需要3.5個小時。

我試圖做一個mongotop,但它告訴我所有顯示的集合的0ms統計信息。我能做其他事情來弄清楚發生了什麼事嗎?

PS:數據庫已連續9周,並沒有引起問題。

+0

並顯示htop? – alex10

回答

13

有一個叫做db.currentOp()的函數,它列出了當前正在運行的具有非常詳細信息的查詢,它還包括它們運行的​​持續時間(secs_running)。

然後,您可以使用currentOp.opiddb.killOp()來終止該查詢/操作。

如果db.currentOp()沒有返回任何結果,因爲沒有任何查詢破壞了,那麼也有db.setProfilingLevel()這將通過將查詢存儲到「本地」數據庫來啓用分析。 Here是來自"M102: MongoDB for DBAs"課程的「教程」。

+0

感謝您的回答!輸出是'{「inprog」:[]}':( – nxrd

+0

我認爲你可以啓用某種日誌記錄,然後存儲需要花費不尋常的時間進入「本地」數據庫的查詢。看看我是否可以找到更多的信息 –

+0

關於db.setProfilingLevel()的附加信息 –

13

第一個也是更重要的是你要做的是檢查你的查詢類型,例如,在我的情況下,我有同樣的問題,當我檢查我的日誌tail -f /var/log/mongodb/mongod.log(你可以配置這個日誌/ etc/mongod .conf文件)。我只看到了像db.brands.find({「field」:「value」})這樣的簡單查詢,但我檢查了「品牌」集合中的索引,查詢中的這個字段不是索引(db.brands.getIndexes())唯一認爲我做的就是將這個字段索引爲db.brands.ensureIndex({name:1},{unique:true}) off course確保你的字段是唯一的,因爲在這個例子中我把它作爲一個獨特的字段。之後,我的CPU從100%變成了20%。

所以我並不是說你的問題是可以的,但在做一些最大的想法之前檢查你的問題。

+0

這是我的正確答案。儘管我使用最小的Azure虛擬機,但CPU使用率降至95-98%,達到峯值使用率的10% – fillobotto