2015-04-12 32 views
0

我在MongoDB中創建了一個集合,它有四個索引(一個用於_id,一個用於分片鍵,另外兩個索引用於字段f1和f2上的查詢優化),它在8節點羣集上分割(每個節點有14GB RAM)。應用程序是寫在分片集合中添加新索引後,MongoDB寫入性能下降

更新:我使用WiredTiger作爲數據庫引擎。

問題是,當我刪除一個二級索引(從f1或f2),插入速度達到可接受的速度,但是當我添加新索引時,插入性能迅速下降!

我想問題是索引不適合RAM,因爲訪問模式接近隨機,因此HDD速度將是瓶頸。但我期望MongoDB將所有索引加載到RAM中,因爲每個節點的總RAM是14GB,'top'命令表示MongoDB在每個節點上使用大約6GB。該指數大小如下:

每個節點:

  • 2GB的_id指數
  • 1.5GB的shard_key指數
  • 3GB的F1指數
  • 3GB用於f指數
  • 總:所有指數均爲9.5GB

正如您所看到的,總指數s IZE約爲9.5GB,MongoDB是使用6GB左右,且可用RAM爲14GB,因此

  1. 爲什麼添加新的索引
  2. 後的性能下降。如果問題是指數約隨機訪問,爲什麼不的MongoDB不加載RAM上的所有索引?
  3. 我怎樣才能確定每個索引的哪一部分被加載到RAM中,哪一部分沒有被加載?

問候

回答

0

爲什麼

它的預期,指數緩慢寫入性能,因爲每個指標增加工作需要完成寫入量增加新指標後的性能下降。性能下降多少?你能量化它降低多少,性能改變是可以接受的嗎?你能向我們展示一個示例文檔並指定你正在創建的索引是什麼?一些索引比其他索引維護成本高得多。

如果問題是關於隨機訪問索引,爲什麼MongoDB不會加載RAM上的所有索引?

它會加載正在使用的內容。你怎麼知道它沒有把索引加載到RAM中?儘管有額外的RAM,你是否看到很多頁面錯誤?您的WiredTiger緩存大小設置爲多少?

我該如何確定每個索引的哪一部分被加載到RAM中,哪部分沒有?

我不相信有一個簡單的方法來做到這一點。