MongoDB 3.2 WiredTiger 压缩是否包括存储在 RAM 中的内容

MongoDB 3.2 WiredTiger 压缩是否包括存储在 RAM 中的内容

据我了解,WiredTiger 会压缩日志、集合和索引。当它们存储在 RAM 中时,它也会压缩它们吗?

例如,如果我的压缩索引占用 10 MiB 磁盘空间,我可以假设它们也占用 10 MiB 的 RAM 空间吗?或者我应该预期 RAM 中未压缩的索引空间更大吗?

答案1

WiredTiger 在磁盘和内存中对数据的表示方式不同,并且对索引和集合数据使用不同的压缩方法。

关于内存中压缩的内容的答案有些微妙,但高层次的总结是:

  • 集合数据在文件系统缓存中被压缩
  • 集合数据在 WiredTiger 内部缓存中未压缩
  • 索引在磁盘和内存中被压缩

压缩方法

默认情况下,WiredTiger 使用 Snappy 块压缩来处理集合数据,但还有其他可用选项,包括 zlib 压缩或不压缩。块压缩可以节省大量存储空间,但数据必须解压缩才能由服务器操作。无论使用哪种压缩选项,数据仍会以与 WiredTiger 缓存中的内存表示不同的块格式写入磁盘。

索引使用索引前缀压缩进行压缩,这可以有效地从索引字段中删除重复的常见前缀。这对于复合索引尤其有效,因为前导字段值将与索引中其他字段的唯一值重复。前缀压缩还允许查询直接在压缩索引上运行。

RAM 中压缩了什么?

与 MongoDB 3.4 一样(包括带有 WiredTiger 的早期 MongoDB 版本),RAM 中有两个重要的数据缓存:

  • WiredTiger 内部缓存由cacheSizeGB配置设置

    MongoDB 3.4 中的默认缓存大小为 RAM 的 50% 减去 1GB,即 256MB。内部缓存中的集合数据未压缩,但索引数据仍使用前缀压缩。内部 WiredTiger 缓存中的数据实际上是当前工作集

  • O/S 文件系统缓存,通常是 WiredTiger 缓存或其他进程未使用的剩余可用 RAM。

    文件系统缓存与磁盘上的表示相同。

缓存调整

请注意,WiredTiger 缓存并不代表 MongoDB 的总内存使用情况:mongod仍然需要在缓存之外分配内存以供其他用途,例如连接和数据处理(例如聚合、map/reduce、内存排序)。

WiredTiger 内部缓存通常应保留为默认大小或可能减小。如果您的数据压缩效果良好且未压缩的数据比 RAM 大得多,则可以通过减小 WiredTiger 缓存大小来释放文件系统缓存的内存,从而在 RAM 中容纳更多数据。MongoDB 手册有一个常见问题解答,其中包含更多信息:我应该将 WiredTiger 内部缓存设置为多少大小?

如需了解更多背景信息,我建议您查看MongoDB 3.0 中的新压缩选项博客文章和WiredTiger的技术介绍推介会。

相关内容