2012-09-12 73 views
9

我看到數量龐大遭受巨大的(200〜++)故障/秒我mongostat輸出數量,儘管非常低的鎖%:蒙戈從故障

enter image description here

我蒙戈服務器對亞馬遜雲m1.large實例正在運行,所以他們每個人都有的RAM ::

root:~# free -tm 
      total  used  free  shared buffers  cached 
Mem:   7700  7654   45   0   0  6848 

顯然,對於所有的cahing蒙戈想做的事,我沒有足夠的內存7.5GB(其中,順便說一句,由於磁盤IO,導致CPU使用率很高)。

我發現this document這表明,在我的情況(高容錯,低鎖%),我需要「向外擴展讀取」和「更多的磁盤IOPS。」

我正在尋找如何最好地實現這一目標的建議。也就是說,有很多由我的node.js應用程序執行的不同潛在查詢,我不確定瓶頸在哪裏發生。當然,我已經試過

db.setProfilingLevel(1); 

然而,這並不能幫助我那麼多,因爲輸出統計只顯示我的查詢速度慢,但我有一個很難翻譯這些信息納入哪些查詢導致頁面錯誤......

正如你所看到的,這是造成巨大(接近100%)CPU的等待時間我的主要蒙戈服務器上,雖然2個輔助服務器不會受到影響......

enter image description here

這是什麼蒙戈文檔不得不說一下頁面錯誤:

頁故障表示MongoDB的要求並不位於物理內存中的數據的次數,並且必須從虛擬內存中讀取。要檢查頁面錯誤,請參閱serverStatus命令中的extra_info.page_faults值。此數據僅在Linux系統上可用。

單獨的頁面錯誤很小且很快就完成;然而,總體而言,大量的頁面錯誤通常表明MongoDB正在從磁盤讀取太多數據,並可能表明一些潛在的原因和建議。在許多情況下,MongoDB的讀取鎖定將「產量」的頁面故障後,允許其他進程讀取和避免阻塞,同時等待下一個頁面讀取到內存中。這種方法提高了併發性,而且在大批量系統中,這也提高了整體吞吐量。

如果可能的話,增加的訪問MongoDB的RAM容量,可幫助減少頁面錯誤的數量。如果這是不可能的,你可能要考慮部署碎片羣集和/或添加一個或多個碎片到您的部署分配的mongod實例間的負載。

所以,我想建議的命令,這是非常無益的:

PRIMARY> db.serverStatus().extra_info 
{ 
    "note" : "fields vary by platform", 
    "heap_usage_bytes" : 36265008, 
    "page_faults" : 4536924 
} 

當然,我可能會增加服務器的尺寸(更多的RAM),但價格昂貴,似乎是矯枉過正。我應該實行分片,但實際上,我不確定什麼是收藏需要分片!因此,我需要一種方法來隔離在故障正在發生(什麼具體的命令造成的故障)。

感謝您的幫助。

+1

我知道這是一個古老的問題,但有幾件事情會跳出來。在設置'db.setProfilingLevel(1)'後,你需要執行這些查詢並在其上運行'explain()'。很有可能這些查詢不使用索引並執行完整的收集掃描。您的輔助人員閒置是另一個值得關注的問題,具體取決於您的應用程序設置'slaveOk = true'可以通過對輔助人員施加一些負載來提供幫助。我會確保你的索引是首先確定的,或者你只是把苦難傳播給次要人物。 – hwatkins

回答

6

我們不知道你的數據/索引是什麼樣的。

不過,MongoDB優化的一個重要規則:
確保您的索引適合內存。 http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-MakesureyourindexescanfitinRAM

認爲較小的文件,較高的鍵/文檔比率將是,具有較高的RAM/Disksize比例將需要。

如果你能調整你的模式有點某些數據一概而論,並減少所需按鍵的數量,這可能幫助。

+0

看來我錯過了「每個查詢一個索引」的部分。由於我沒有意識到「必須適合內存」約束,所以我對於我的模式索引的使用也非常過分。儘管有關索引最佳實踐的疑問:當執行也使用sort()或limit()的查詢時,我應該在這些字段上編制索引嗎?如果我有查詢在多種條件下搜索(例如{'age':30,'name':y}),有沒有什麼好的方法可以決定索引哪兩列(兩個?)? –

+0

- 在執行db.XX.dropIndexes()之後,我需要做些什麼來恢復mongo服務器上的資源/停止頁面錯誤?我放棄了所有索引,並以更保守的方式重新索引,但是沒有看到任何改進仍然存在 –

+0

至於你的第一個問題,通常很難回答這些問題,這些是我們提出的問題以及我們在模式設計中所做的折衷。對於複合索引,如果你正在搜索字段A或A,B或A,B,C,那麼你可以在[A,B,C]上創建一個複合索引,如果你在B或C上搜索,它將不會對你有所幫助。http://www.mongodb.org/display/DOCS/Indexes#Indexes-CompoundKeys – z5h