关于mogodb缓存

With WiredTiger, MongoDB utilizes both the WiredTiger internal cache and the filesystem cache.

Starting in 3.4, the WiredTiger internal cache, by default, will use the larger of either:

    50% of (RAM - 1 GB), or
    256 MB.

mongodb4.0文档,大概意思是mongodb使用internal cache and the filesystem cache,
(1))请问一下如果机子内存2g,那么按照上面的计算,internal catche将占用512m,如果数据增加,内存占用超过512m,是不是就开始启用filesystem cache,把此时数据缓存放在空闲内存上,两者有没有先后顺序?
(2)既然两者都是放在内存中,为什么还要分两类缓存,是不是internal cache占据内存是不能被释放的,filesystem cache占据的是会被其他服务挤掉的,是这样吗?
(3)这些缓存是不是也是压缩过的?

阅读 5.9k
2 个回答

楼上基本都答到了。补充一些:
filesystem cache是操作系统行为,不受应用控制的。必要的时候这部分缓存会被分给其他进程。因为filesystem cache是对磁盘文件的忠实映射,而MongoDB在磁盘上存储的文件是压缩过的,所以这就代表着在filesystem cache中的内容是压缩过的。
internal cache则是MongoDB控制的部分,其中存储的是最近用到过的数据,索引等,并且是解压过的。
1) 这实际上是操作系统原理方面的知识。MongoDB要把数据加载到内存中,首先要从磁盘上读取原始的文件,那么文件内容就会进入filesystem cache. 然后要把文件内容转换为WiredTiger可以直接使用的格式,即解压,解密,之后的内容才会进到internal cache。所以一定要说先后顺序的话,internal cache中的内容肯定来自filesystem cache,后者先加载。
2) internal cache是进程内存,filesystem cache是操作系统缓存。后者在一定时候会被LRU算法驱逐出内存。如果再次被读取又会从磁盘加载。不过前者同样有可能会被驱逐出内存,因为数据容量可能比缓存大,那么就是保留需要的内容,释放掉暂时不用的部分。这里同样的是LRU。
3)internal cache未压缩,filesystem cache压缩。

额外一些需要注意的问题:

  1. 索引无论在internal cache还是filesystem cache都是压缩的,压缩的是索引的键。
  2. filesystem cache对性能的影响同样至关重要,不要忽略它的作用。

internal cache 你可以理解为程序使用的内存。filesystem cache 理解为操作系统的文件系统缓存机制。

在mongo 的 WiredTiger 缓存机制中。如果不做配置的话,他会默认使用你的50% 的系统内存做索引和数据的缓存。
如果你是 2G 的内存,有1G都会做缓存用。
如果你的机器内存比较小,小于 512M 它就使用 256M 内存做缓存。

文件系统的缓存是在内核层面的。你打开一个文件,读了读。关闭了它。系统会根据你的使用程度做一些缓存。你关闭这个文件的时候,操作系统可能并没有把数据从物理内存释放。你再次打开读取这个文件就要比首次打开要快。

mongo 的缓存是否压缩过没有研究过。

推荐问题
宣传栏