Mongodb

MongoDB 3.2 WiredTiger 壓縮是否包括儲存在 RAM 中的內容

  • January 13, 2017

據我了解,WiredTiger 壓縮日誌、集合和索引。當它們儲存在 RAM 中時,它是否也會壓縮它們?

例如,如果我的壓縮索引在磁碟上使用 10 MiB,我是否可以假設它們也使用 10 MiB 的 RAM?還是我應該期望 RAM 中有更大的未壓縮索引?

WiredTiger 對磁碟和記憶體中的數據有不同的表示形式,並且對索引和集合數據使用不同的壓縮方法。

關於記憶體中壓縮內容的答案有些細微差別,但高級摘要是:

  • 收集數據在文件系統記憶體中壓縮
  • 集合數據在 WiredTiger 內部記憶體中未壓縮
  • 索引在磁碟和記憶體中被壓縮

壓縮方法

預設情況下,WiredTiger 對集合數據使用 Snappy 塊壓縮,但還有其他可用選項,包括 zlib 壓縮或不壓縮。塊壓縮可以顯著節省儲存空間,但數據必須未經壓縮才能被伺服器處理。不管壓縮選項如何,數據仍以與 WiredTiger 記憶體中的記憶體表示不同的塊格式寫入磁碟。

索引使用索引前綴壓縮進行壓縮,這有效地從索引欄位中刪除了公共前綴的重複數據。這對於復合索引尤其有效,因為前導欄位值將與索引中其他欄位的唯一值重複。前綴壓縮還允許查詢直接對壓縮索引進行操作。

RAM中壓縮了什麼?

在 MongoDB 3.4(包括之前帶有 WiredTiger 的 MongoDB 版本)中,RAM 中有兩個重要的數據記憶體:

MongoDB 3.4 中的預設記憶體大小是 50% RAM 減去 1GB 或 256MB 中的較大者。內部記憶體中的集合數據未壓縮,但索引數據仍使用前綴壓縮。內部 WiredTiger 記憶體中的數據實際上是目前工作集

  • O/S 文件系統記憶體,通常是未由 WiredTiger 記憶體或其他程序使用的剩餘空閒 RAM。

文件系統記憶體與磁碟表示相同。

記憶體調整

請注意,WiredTiger 記憶體並不代表 MongoDB 的總記憶體使用量:mongod仍需要在記憶體之外分配記憶體用於其他用途,例如連接和數據處理(例如聚合、映射/歸約、記憶體中排序)。

WiredTiger 內部記憶體通常應保留預設大小或可能減小。如果您的數據壓縮得很好並且未壓縮的數據比 RAM 大得多,您將能夠通過減少 WiredTiger 記憶體大小以釋放文件系統記憶體的記憶體來在 RAM 中容納更多數據。MongoDB 手冊中有一個包含更多資訊的常見問題解答:我應該將 WiredTiger 內部記憶體設置為多大?.

有關更多背景資訊,我建議查看MongoDB 3.0部落格文章中的 New Compression Options 和A Technical Introduction to WiredTiger展示文稿。

引用自:https://serverfault.com/questions/826181