我有一个复制的mongodb设置,我看到很多页面错误。所以我开始调查并发现(通过vmmap
)几乎整个local
数据库都在内存中(即工作集的一部分)。当然唯一的重要集合是用于复制的oplog.rs
。查看正在运行的查询,oplog上的查询是针对尾部而不是oplog头部的数据。那么为什么整个事情仍然在记忆中呢?当然,由于大量的故障,它应该被换掉。
我在这里误解了什么吗?我是否错误地阅读了vmmap
信息?或者实际上出了什么问题?
请注意,这是一个测试设置,并且此硬件上还运行了一些其他mongod
实例,因此此处使用的内存总量不等于计算机中的总数。总体而言,内存使用率约为100%。
答案 0 :(得分:4)
Mongo将页面管理委托给内核 - 因为它使用映射文件,它只依靠内核来决定页面输出。每次写入或接收来自另一个人的读取时,都会触摸您的local
数据库。 oplog是一个上限集合,因此它将不断修改数据文件中的固定空间(因此,RAM中的固定空间),这应该保持触摸,并且不会在优先级列表上被分页。
对于您的大量页面错误,这些缓存变暖是否有可能?当Mongo刚刚启动时,它不会将其工作集加载到内存中,因此需要稍微查询一些事情来预热并从磁盘和内存中获取内容。
不要忘记考虑缓存和缓冲区 - 你的内存使用率可能是100%读取,但内核会在它发布其他内容之前使缓存和缓冲区过期,所以可能是你的系统是报告接近100%的使用率,其中很大一部分是缓存和缓冲区,它们将根据需要进行刷新,这意味着mongo的工作集永远不必被分页。
您可以通过运行旨在占用越来越多内存(like this one)的程序来测试这一点,并了解一旦系统实际进行交换后mongo的行为。