关于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)这些缓存是不是也是压缩过的?
internal cache 你可以理解为程序使用的内存。filesystem cache 理解为操作系统的文件系统缓存机制。

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

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

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对性能的影响同样至关重要，不要忽略它的作用。