2012-08-06 36 views
2

我即將開始使用在亞馬遜雲上運行的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的儀表板圖像): 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 
} 

編輯:更多圖表 enter image description here enter image description here

+0

您可以讓我們知道您在AWS上運行的實例大小嗎?另外,在這個高峯期間,你看過數據庫上正在運行的當前操作嗎?當時那個時候還有其他活動在發生嗎? – 2012-08-06 16:57:54

+0

我現在對所有3個副本使用m1.small實例;我很樂意升級,但如果這些對於10位用戶來說不夠用,我會嚴重關注可擴展性。你能指點我如何看@數據庫上的併發操作嗎?除了mongodb日誌文件中的這些「更新」請求,我沒有看到任何東西,但我不確定我是否應該查看其他東西... – 2012-08-06 17:10:17

+1

當您登錄到實例時,可以運行以下命令:db.currentOp.inprog.length獲取任何給定時刻的操作數。 要查看實際操作...只需關閉inprog.length,那麼:db.currentOp() – 2012-08-06 17:58:34

回答

5

通常在MongoDB中,CPU峯值來自兩個特定的問題。通常情況下,MongoDB的CPU非常低。它通常完全受IO或內存佔用的限制。

這裏是(希望)一個有用的簡短列表:

  1. 壞查詢。這是沒有索引的任何查詢。我注意到DataCache有一個未被編入索引的Updated字段。你是否對該領域的每一個疑問?
  2. 地圖/減少。 Map/Reduce作業通常會以100%「掛鉤」一個核心。你在這些數據庫上有多少個核心?你正在運行MR工作嗎?
  3. IO屏蔽爲CPU。根據報告,CPU實際上可能是CPU_WAIT,這通常是磁盤IO。

所以,如果你回到圖表,看看你的IO時間和你的RAM使用情況。找出你的RAM:數據比例並找出你的IO需求。並讓我們知道您使用的是什麼類型的機器。

+0

1)我不查詢更新字段,不。這就是說...還有其他一些收藏品。在使用索引時真的有點過分了嗎?是真的嗎?如果不是,我會在模型中更加自由地添加這些內容。 (2)我沒有做這些 (3)嗯,這是否會反映在磁盤使用圖?我將如何檢測它?我已經用更多圖表更新了我原來的帖子... – 2012-08-06 17:24:39

+0

MongoDBs都是m1.small實例。我已經用更多圖表更新了原始文章。請讓我知道,如果我可以提供任何其他東西。 – 2012-08-06 17:27:18

+0

@ZaneClaes,嗨。我知道這是很久以前的事了,但是你碰巧記得你的解決方案是什麼? – 2017-04-20 11:42:47

相關問題