標籤:文檔 好的 效能 地址空間 伺服器 恢複 插入 char 資料檔案
MMAPv1 是mongodb 在3.2以前預設的儲存引擎,在3.2 之後預設的儲存引擎為WiredTiger,MMAPv1儲存引擎基於記憶體對應檔,它擅長高容量的插入,讀取和更新。
Journal
為了確保所有對mongodb 資料集的修改是可持續的寫到磁碟中,mongodb 預設所有的記錄都寫在磁碟中的日誌裡面,mongodb寫日誌比寫資料檔案更加平凡。預設的情況下,mongodb每隔60秒寫到磁碟中的資料檔案一次,而寫記錄檔粗略的每隔100毫秒,這些值都是他們寫資料檔案的最大時間間隔,在更多的mongodb的應用例子中,mongdb和作業系統重新整理資料到磁碟是更加頻繁的,因此這些值都是理論上的最大值。,去改變記錄檔寫的時間間隔,看 storage.syncPeriodSecs ,改變記錄檔寫入的時間間隔看storage.journal.commitIntervalMs。
當mongdb的執行個體退出後,這些日誌允許mongdb從資料檔案中恢複資料並不重新整理所有的改變。
Record Storage Characteristics
所有的記錄被寫進磁碟中,當一個document變的比被分配到的磁碟的地址空間更大的時候,mongdb 必須分配一個新的地址,新的地址要求mongodb 移動這個document 和更新與這個document 有關的所有的索引,這將導致需要花費更多的時間去更新地址和整理儲存片段。
值得慶幸的是,在mongdb3.0以後的版本中,有所改變,預設的情況下,3.0以後的版本中, 使用了 Power of 2 Sized Allocations,每一個在mongdb中的document被儲存在一個磁碟空間中,這個空間包括他自己和一些額外的空間,這些額外的空間允許document更新導致的增長以最大可能的減少重新分配。
Record Allocation Strategies
mongodb 支援多個空間分配策略,當分配一個空間時,這些策略決定mongod 怎樣增加一個額外的空間到這個doument上,因為在mongodb 中,document在插入後是可以增加的,所有的記錄都在磁碟上,一個額外的空間可以減少一個document在更新變大重新分配空間的需要。重新分配更新空間效率是比在本地空間更新效率低,並且重新分配空間導致儲存的片段,因此,所有的另外增加額外的(padding stratrgies)策略交換另外的空間提高了效率減少了片段。
不同的策略支援不同的工作負載,lead to storage fragmentation 是對插入更新和刪除的工作負載時更佳有效, exact fit allocations(精確分配)是一個好的策略對於一個沒有更新和刪除的工作負載。
Power of 2 Sized Allocations
mongodb 在3.0 以後的版本中預設使用了Power of 2 Sized Allocations 的分配策略為MMPAPv1,每一個空間的大小都是2的指數位元(如:32,64,128,256,512 ... 2MB),由於文檔的大小都超過了2MB ,分配的空間被上升到了2MB 的倍數。
The power of 2 sizes有如下關鍵的屬性:
* 可以有效重新釋放空餘的空間用來減少分裂。把特定的空間大小轉化為一個固定大小增加的集合,插入的資料將儲存在可能被更早的document刪除或者搬遷創造的空間中。
*可以減少移動,增加額外的裝飾空間給一個document不需要移動就可以增長空間。另外,節省了移動的花費,在不需要更多的去更新索引。雖然The power of 2 sizes策略可以最大程度的減少移動,但是不能完全的消除。
No Padding Allocation Strategy
對於一些collections 工作不改變文檔的大小,如插入和更新工作,這些工作都不增加檔案的大小,這個時候The power of 2 sizes 策略是沒用的,你可以使用collMod 命令或者db.createCollection() 方法並且用nopadding 對象。
在3.0以前,mongdb 使用一個分配策略,這個策略包括動態計算padding 作為一個document 大小的因素。
Memory Use
使用MMAPv,mongodb 自動使用所有機器的閒置記憶體作為它的cache,系統資源監視器監視mongodb 使用的記憶體情況,這意外這著mongodb將儘可能多的使用閒置記憶體,如果其他的進程突然需要伺服器大量的記憶體,mongdb 將會緩衝記憶體到其他的進程。
嚴格的來說,作業系統的虛擬記憶體的子系統管理mongdb記憶體,這意外著mongodb將儘可能的使用更多的閒置記憶體,按照實際需要記憶體和磁碟進行資料交換,部署充足的記憶體去使應用程式工作的資料集有充足的RAM,使mongodb 達到最好的效能。
[mongodb] :MMAPv1 Storage Engine