Roe*_*ker 6 memory-management mongodb
我有一个复制的 mongodb 设置,并且看到很多页面错误。于是我开始调查,发现(通过vmmap)几乎整个local数据库都在内存中(即工作集的一部分)。唯一有意义的集合当然是oplog.rs用于复制的。查看正在运行的查询,oplog 上的查询所针对的数据距离操作日志尾部比距离头部更近。那么为什么整个事情仍然在记忆中呢?由于故障较多,当然应该更换。
我在这里误解了什么吗?我是否vmmap错误地阅读了信息?或者确实出了什么问题?

请注意,这是一个测试设置,还有一些其他mongod实例在此硬件上运行,因此此处使用的内存总量并不等于机器中的内存总量。总体而言,内存使用率约为 100%。
Mongo 将页面管理委托给内核 - 因为它使用映射文件,所以它只依赖内核来决定调出哪些内容。local每次您进行写入操作或从另一个数据库接收读取操作时,您的数据库都会被触及。oplog 是一个有上限的集合,因此它将不断修改数据文件中的固定空间(因此,RAM 中的固定空间),这应该保持它的接触状态,并且在被调出的优先级列表中不会很高。
至于您的大量页面错误,这些是否可能是简单的缓存预热?Mongo 在刚启动时不会将其工作集加载到内存中,因此需要进行一些查询来预热并将数据从磁盘中取出并加载到内存中。
不要忘记考虑缓存和缓冲区 - 您的内存使用率可能会以 100% 的速度读取,但内核将在调出其他内容之前使缓存和缓冲区过期,因此,当您的系统报告接近100% 使用率,其中很大一部分是缓存和缓冲区,它们将根据需要刷新,这意味着 mongo 的工作集根本不需要换出页面。
您也许可以通过运行一个旨在消耗越来越多内存的程序(如这个)来测试这一点,并查看一旦系统实际达到交换状态后 mongo 的行为方式。