我看到數量龐大遭受巨大的(200〜++)故障/秒我mongostat輸出數量,儘管非常低的鎖%:蒙戈從故障
我蒙戈服務器對亞馬遜雲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個輔助服務器不會受到影響......
這是什麼蒙戈文檔不得不說一下頁面錯誤:
頁故障表示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),但價格昂貴,似乎是矯枉過正。我應該實行分片,但實際上,我不確定什麼是收藏需要分片!因此,我需要一種方法來隔離在故障正在發生(什麼具體的命令造成的故障)。
感謝您的幫助。
我知道這是一個古老的問題,但有幾件事情會跳出來。在設置'db.setProfilingLevel(1)'後,你需要執行這些查詢並在其上運行'explain()'。很有可能這些查詢不使用索引並執行完整的收集掃描。您的輔助人員閒置是另一個值得關注的問題,具體取決於您的應用程序設置'slaveOk = true'可以通過對輔助人員施加一些負載來提供幫助。我會確保你的索引是首先確定的,或者你只是把苦難傳播給次要人物。 – hwatkins