Query

MongoDB對高數據的優化

  • July 19, 2012

我有一個mongoDB集合,每天有 42M 寄存器和 1M 新寄存器

我們發現mongoDB 查詢性能低下。在 mongostat 中顯示欄位:qr|qw ar|aw,值為300-500

第一步是檢查索引並為可能需要很長時間的查詢創建新索引。

現在我們大部分時間都得到了很好的表現。

但在某些情況下(隨機時間),我們會得到很多處於待處理狀態的連接,查詢速度都很慢。

但是,top 命令在處理速度和記憶體方面顯示出良好的性能。

問題是:

  • 我如何進一步檢查未優化的查詢。
  • 在 new relic show 這個特定集合中的 INSERT 命令佔用了“最耗時”的 62%,有什麼辦法可以加快速度?
  • 為什麼可能是掛起連接的原因?奇怪的是:當數字開始上升時,直到網站崩潰才停止。

編輯:

我們最終通過以下步驟解決了大部分問題:

  • 將 mongo 移動到沒有 openvz 的新伺服器,似乎 mongo 給 openvz 帶來了麻煩
  • 新的文件系統和 saas。
  • 根據我們的需要創建新的索引。

Mongo 現在執行得很好,所以感謝大家的幫助 :)

首先,讓我說,根據給出的資訊,很難找到根本原因——這通常是一個迭代過程,需要多次嘗試才能找到罪魁禍首。為了回答您的“下一步是什麼?” 問題的一部分,而不是確定根本原因,請繼續閱讀…..

首先,有幾點建議:

  1. 讓主機進入 MMS(它是免費的) - 請參閱http://mms.10gen.com - 這樣您就可以隨時間繪製統計數據並查看問題,而不必坐在盒子上執行命令
  2. 也安裝 munin-node,這樣您就可以將操作等與 IO 相關聯(安裝 MMS 文件對此進行了解釋)。

接下來,對常見原因進行一些快速檢查:

  • 你的文件系統/核心是什麼?- 這些通常需要是 ext4/XFS 並且足夠新才能讓 fallocate 工作(分別為 2.6.23 和 2.6.25),這樣新文件分配不會很慢
  • 假設您沒有安裝 MMS 和 munin,讓 iostat 輸出與 mongostat 匹配以確定 IO 是否是瓶頸的根本原因
  • 您是否會定期進行批量更新以顯著增加文件(即會導致移動)?移動很昂貴,並且可能導致 IO 得到備份
  • 您的磁碟是否達到您正在寫入的數據量?預設情況下,MongoDB 每 60 秒 fsync 一次到磁碟,如果需要在 60 秒後同步的捲很大(比如因為插入峰值),那麼您也可能會遇到問題

這不是一個詳盡的清單,我已經看到其他問題導致了這個,但這應該讓你開始走上正確的道路。

引用自:https://dba.stackexchange.com/questions/21026