我即將開始使用在亞馬遜雲上運行的node.js/mongo應用程序。我爲Mongo服務器設置了3個副本集。一切正常,直到突然,大約20分鐘前,PRIMARY mongo服務器跳到100%的CPU使用率(通常幾乎沒有任何使用)。我目前正在測試只有10個用戶的應用程序,所以這非常令人擔憂。如何解決我的MongoDB服務器突然佔用100%CPU的原因?
我的第一反應當然是從服務器獲取mongodb日誌文件。我預計這會顯露出來,但現在我比以往更加困惑。我的一個數據庫的主要功能是爲用戶的緩存數據,所以我有一個集(「數據高速緩存」),它僅存儲一個JSON字符串(貓鼬代碼):
new Model('DataCache',{
'_id': { type: String, unique: true },
'data': String,
'updated': Date });
從望着日誌「 100%CPU「時間我看到標準更新請求已執行,但花費了大約47秒!
Mon Aug 6 08:58:36 [conn28821] update storage.datacache query: { _id: "14954006/mentions/dcc3c69e72da714a0f3bffc518183ebb" } update: { $set: ... } } 47174ms
此請求是不是在比平常的數據的任何更長(在JSON字符串約1000個字符;數據在這裏被截斷爲簡潔)。
我真的不知道還有什麼地方需要弄清楚爲什麼我的用法突然跳到這麼遠。我無法想象這種情況下什麼是不尋常的/獨特的,我沒有看到日誌中的其他東西,但我非常擔心當我們的10個用戶擴展到數千人時會發生什麼......
問題就消失了一樣突然,因爲它出現了,開始約20分鐘後,但CPU仍然看到奇怪的峯值(RightScale的儀表板圖像):
更新:這裏的一些信息從蒙戈印刷有關緩存集合, 尤其是。我不能肯定,問題與緩存收集的事,但它是一個查詢中的滯後時間,我看到的最一致...
{
"ns" : "storage.datacache",
"count" : 43949,
"size" : 132274592,
"avgObjSize" : 3009.729277116658,
"storageSize" : 158887936,
"numExtents" : 13,
"nindexes" : 5,
"lastExtentSize" : 33828864,
"paddingFactor" : 1.0099999999994833,
"flags" : 1,
"totalIndexSize" : 10972192,
"indexSizes" : {
"_id_" : 4570384,
},
"ok" : 1
}
編輯:更多圖表
您可以讓我們知道您在AWS上運行的實例大小嗎?另外,在這個高峯期間,你看過數據庫上正在運行的當前操作嗎?當時那個時候還有其他活動在發生嗎? – 2012-08-06 16:57:54
我現在對所有3個副本使用m1.small實例;我很樂意升級,但如果這些對於10位用戶來說不夠用,我會嚴重關注可擴展性。你能指點我如何看@數據庫上的併發操作嗎?除了mongodb日誌文件中的這些「更新」請求,我沒有看到任何東西,但我不確定我是否應該查看其他東西... – 2012-08-06 17:10:17
當您登錄到實例時,可以運行以下命令:db.currentOp.inprog.length獲取任何給定時刻的操作數。 要查看實際操作...只需關閉inprog.length,那麼:db.currentOp() – 2012-08-06 17:58:34