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 達到最好的性能。