5

我有一个复制的 mongodb 设置,我看到很多页面错误。所以我开始调查并发现(通过vmmap)几乎整个local数据库都在内存中(即工作集的一部分)。唯一意义的集合当然oplog.rs是用于复制的。查看正在运行的查询,oplog 上的查询是针对更接近尾部而不是 oplog 头部的数据。那么为什么整个事情还在记忆中呢?当然,由于大量的故障,它应该被换掉。

我在这里误解了什么吗?我是否vmmap错误地阅读了信息?还是真的出了什么问题?

VMMap 截图

请注意,这是一个测试设置,并且在此硬件上运行了一些其他mongod实例,因此此处使用的内存总量不等于机器中的总量。总体而言,内存使用率约为 100%。

4

1 回答 1

4

Mongo 将页面管理委托给内核——因为它使用映射文件,所以它只依赖内核来决定要分页的内容。local每次您进行写入或接收来自另一个人的读取时,您的数据库都会被触及。oplog 是一个有上限的集合,所以它会不断地修改数据文件中的固定空间(因此,RAM 中的固定空间),这应该保持它被触及并且在被分页的优先级列表中不是很高。

至于您的大量页面错误,是否有可能是简单的缓存变暖?Mongo 在刚启动时不会将其工作集加载到内存中,因此需要一些查询来预热并将内容从磁盘中取出并放入内存中。

不要忘记考虑缓存和缓冲区 - 您的内存使用率可能会以 100% 读取,但内核会在分页出其他内容之前使缓存和缓冲区过期,因此可能是当您的系统报告接近100% 的使用率,其中很大一部分是缓存和缓冲区,它们将根据需要被刷新,这意味着 mongo 的工作集根本不需要被分页。

您可以通过运行一个旨在消耗越来越多内存的程序(例如这个)来测试这一点,并查看一旦您的系统实际运行交换时 mongo 的行为。

于 2013-05-08T17:20:27.547 回答