【发布时间】:2015-03-13 02:02:32
【问题描述】:
假设我在 mongodb 中有一个只有一个索引的集合,并且我需要使用该 mongo 集合的应用程序的整个生命周期的索引。 我想知道 mongodb 的行为。 在这种情况下,一旦索引加载到内存中,mongodb 会将其保存在内存中吗?
谢谢
【问题讨论】:
假设我在 mongodb 中有一个只有一个索引的集合,并且我需要使用该 mongo 集合的应用程序的整个生命周期的索引。 我想知道 mongodb 的行为。 在这种情况下,一旦索引加载到内存中,mongodb 会将其保存在内存中吗?
谢谢
【问题讨论】:
MongoDB 将首先从 RAM 中取出 LRU (least recently used) 数据。因此,如果您只有一个索引,它很可能会继续被经常使用,并且应该保留在内存中。
【讨论】:
很遗憾,您目前无法将集合或索引固定在内存中。 MongoDB 使用内存映射文件将集合和索引加载到内存中。当您的活动通过查询、更新、插入和删除触及数据库的各个部分时,这些数据将被加载到内存中。这被称为工作集。如果加载工作集所需的总内存小于可用内存,没问题。
如果没有,MongoDB 将使用 LRU 算法从内存中选择要卸载的内容。这就是为什么理解工作集的概念以及它与可用内存的关系如此重要的原因。
文档中的这篇文章应该会有所帮助:
如何计算我的应用程序需要多少 RAM?
您需要的 RAM 数量取决于几个因素,包括但 不限于:
- 数据库存储和工作集之间的关系。
- LRU(最近最少使用)的操作系统缓存策略
- 日记的影响
- 页面错误和其他 MMS 计量器的数量或速率,用于检测您何时需要更多 RAM
每个数据库连接线程最多需要 1 MB 的 RAM。 MongoDB 将数据从 磁盘。它只是内存映射其所有数据文件并依赖于 操作系统来缓存数据。操作系统通常会驱逐 当内存不足时,RAM 中最近最少使用的数据。为了 例如,如果客户端访问索引比访问文档更频繁,那么 索引更有可能保留在 RAM 中,但这取决于您的 特殊用法。
要计算你需要多少 RAM,你必须计算你的工作 设置大小,或客户最常使用的数据部分。 这取决于您的访问模式、您拥有的索引以及 您的文件的大小。因为 MongoDB 每个连接使用一个线程 模型,每个数据库连接也将需要最多 1MB 的 RAM, 活动或空闲。
如果页面错误很少发生,则您的工作集适合 RAM。如果故障 利率上升高于此,您将面临性能下降的风险。这是 SSD 驱动器的重要性不如旋转磁盘。
http://docs.mongodb.org/manual/faq/diagnostics/
您可以使用 serverStatus 命令来估计您当前的工作集:
db.runCommand( { serverStatus: 1, workingSet: 1 } )
【讨论】: