据我了解,WiredTiger 压缩日志、集合和索引。当它们存储在 RAM 中时,它是否也会压缩它们?
例如,如果我的压缩索引在磁盘上使用 10 MiB,我是否可以假设它们也使用 10 MiB 的 RAM?还是我应该期望 RAM 中有更大的未压缩索引?
据我了解,WiredTiger 压缩日志、集合和索引。当它们存储在 RAM 中时,它是否也会压缩它们?
例如,如果我的压缩索引在磁盘上使用 10 MiB,我是否可以假设它们也使用 10 MiB 的 RAM?还是我应该期望 RAM 中有更大的未压缩索引?
WiredTiger 对磁盘和内存中的数据有不同的表示形式,并且对索引和集合数据使用不同的压缩方法。
关于内存中压缩内容的答案有些细微差别,但高级摘要是:
压缩方法
默认情况下,WiredTiger 对集合数据使用 Snappy 块压缩,但还有其他可用选项,包括 zlib 压缩或不压缩。块压缩可以显着节省存储空间,但数据必须未经压缩才能被服务器处理。不管压缩选项如何,数据仍以与 WiredTiger 缓存中的内存表示不同的块格式写入磁盘。
索引使用索引前缀压缩进行压缩,这有效地从索引字段中删除了公共前缀的重复数据。这对于复合索引尤其有效,因为前导字段值将与索引中其他字段的唯一值重复。前缀压缩还允许查询直接对压缩索引进行操作。
RAM中压缩了什么?
在 MongoDB 3.4(包括之前带有 WiredTiger 的 MongoDB 版本)中,RAM 中有两个重要的数据缓存:
WiredTiger 内部缓存,由
cacheSizeGB
配置设置控制。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演示文稿。