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)这些缓存是不是也是压缩过的?
楼上基本都答到了。补充一些:
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压缩。
额外一些需要注意的问题: