假设我在mongodb中只有一个集合,只有一个索引,我需要使用该mongo集合的应用程序整个生命周期的索引。 我想知道mongodb的行为。 在这种情况下,一旦将索引加载到内存中,mongodb会将其保留在ram中吗?
由于
答案 0 :(得分:0)
MongoDB将淘汰RAM的第一件事就是LRU(least recently used)数据。因此,如果你只有一个索引,那么它很可能会继续被定期使用,它应该留在内存中。
答案 1 :(得分:0)
很遗憾,您目前无法在内存中固定集合或索引。 MongoDB使用内存映射文件将集合和索引加载到内存中。当您的活动通过查询,更新,插入和删除触摸数据库的各个部分时,该数据将被加载到内存中。这被称为工作集。如果加载工作集所需的总内存小于可用内存,则没问题。
如果没有,MongoDB将使用LRU算法来选择从内存中卸载的内容。这就是为什么了解工作集的概念以及它与可用内存的关系非常重要的原因。
文档中的这篇文章应该会有所帮助:
如何计算应用程序需要多少RAM?
您需要的RAM量取决于几个因素,包括但是 不限于:
- 数据库存储和工作集之间的关系。
- LRU(最近最少使用)的操作系统缓存策略
- 日记的影响
- 当您需要更多RAM时检测页面错误和其他MMS量表的数量或速率
每个数据库连接线程最多需要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 } )