【问题标题】:What will happen,when mongodb db size will be times > then RAM?会发生什么,当 mongodb db size 是 times > then RAM 时会发生什么?
【发布时间】:2012-04-24 04:01:41
【问题描述】:

它会变慢吗?只会为适合 RAM 的数据找到工作吗? 如果 mongodb 索引大于 RAM 会怎样?

【问题讨论】:

    标签: mongodb memory memory-management ram


    【解决方案1】:

    编辑:此答案不再适用(MongoDB 有一个不以这种方式运行的新存储引擎),答案非常陈旧,并且不推荐使用 mmapv1 存储引擎。

    关于 Mongo

    MongoDB 使用内存映射文件。

    这意味着操作系统从本质上控制了内存中的分页(进出磁盘)。

    规则

    如果您的索引 + 工作集超出内存,则最近使用的页面(内存部分)将刷新到磁盘。这只会留下最近使用的数据,这些数据仍然可以随时存储在内存中。

    您的操作系统对此进行控制。

    虽然如果您的真实工作集和索引无法装入内存,您将体验到糟糕的性能,但在实践中,工作集(热数据)的大小远小于其总数据集。

    如果您不违反此规则,即使您的索引 + 总数据可能超过总可用内存,您在大多数情况下也应该有出色的性能。

    工作原理

    如果执行的查询需要不在内存中的数据,它将被分页到内存中(从磁盘中检索)并且会影响性​​能。

    注意:这本质上是数据库首次启动(冷)时的情况。

    一开始内存中没有任何内容,需要数据时会发生页面错误,并根据需要将数据分页到内存中。当内存不足时,最近使用的页面(块)会从内存中刷新,以支持更热(最近访问的)数据。

    另外值得一提的是,由于索引经常被使用,因此总是最近使用,它们实际上永远不会被分页。

    【讨论】:

    • 我不同意“你仍然会体验到相对较高的性能”。根据我的经验,如果索引大小接近或超过 RAM 大小,那么性能会急剧下降。 MongoDB 网站建议您保持索引大小
    • 理所当然的是,当我说如果工作集 + 索引在内存中时性能很好,如果您的索引甚至不适合内存,那么您的工作集将没有太多空间并且不属于“您将体验到高性能”类别,还是我错过了什么?
    • 你的答案是......“如果你的索引 + 工作集超出内存,......”并继续说“除非你不断地接触你的每一个部分,否则你仍然会体验到相对较高的性能数据集。”这是具有误导性的部分 - 一旦索引 > RAM,您无需进行太多操作即可获得糟糕的性能。
    • 是的,因为你肯定会用完工作集 + 索引的内存,然后才会用完索引的内存。如果您的工作集并非全部在内存中,它将在索引之前分页,那么您已经搞砸了。除非你做的每一个查询都在一个覆盖的索引上,否则你将在不必担心索引是否适合内存之前就已经陷入困境,就像地球上的每个数据库一样.
    【解决方案2】:

    如果您的索引大于可用 RAM,则性能会迅速下降。 MongoDB 网站特别建议您“确保您的索引可以放入 RAM”。

    如果您的查询看起来很缓慢,您应该验证您的索引是否 小到足以放入 RAM。例如,如果您在 4GB RAM 上运行 你有 3GB 的索引,那么你的索引可能不合适 在内存中。您可能需要添加 RAM 和/或验证所有索引 您创建的内容实际上正在被使用。

    【讨论】:

      猜你喜欢
      • 2011-08-25
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-26
      相关资源
      最近更新 更多