ram中使用的mongodb清除内存

Posted

技术标签:

【中文标题】ram中使用的mongodb清除内存【英文标题】:mongod clean memory used in ram 【发布时间】:2013-01-06 16:11:16 【问题描述】:

我的 mongodb 中有大量数据。它充满了推文(50 GB),我的 Ram 是 8 GB。查询时,它会检索所有推文,mongodb 开始填充内存,当达到 8 GB 时,它开始将文件移动到磁盘。这是它变得非常缓慢的部分。所以我将查询从跳过并开始使用索引更改。现在我有索引,我只向我的程序查询 8GB,保存文件中使用的最后一条推文的 id,程序停止。然后重新启动程序,它会从文件中获取推文的 id。但是 mogod 服务器仍然占用了前 8GB 的​​内存,将不再使用,因为我有最后一个索引。如何在不重新启动的情况下清理 mongo db 服务器的内存?

(赢了)

【问题讨论】:

虽然有点晚了(在您询问 4 年后):我认为 ***.com/questions/6861184/… 和 ***.com/questions/6861184/… 包含有关限制 MongoDB 内存使用的有用信息。 【参考方案1】:

我有点被你的逻辑弄糊涂了。

所以我将查询从跳过并开始使用索引更改。现在我有了索引,我只向我的程序查询 8GB,保存文件中使用的最后一条推文的 id,然后程序停止。

使用范围查询将无助于您必须分页的数据量(实际上它可能会因为索引而恶化),它只是通过使用索引来加快服务器端的查询速度(例如 42K+ 行)跳过)。如果你和skip() 一样,但是在索引中(没有覆盖索引),那么你仍然在完全相同的页面中。

由于内存映射和您的工作集,它很慢。您拥有比 RAM 更多的数据,不仅如此,而且您使用的数据比 RAM 还多,因此您可能一直处于页面错误状态。

重新启动程序不会解决这个问题,也不会因为您的查询而清除其数据操作系统端(使用重新启动或特定命令)。您可能需要:

考虑您的查询,以便您的工作集更符合您的记忆 或将您的数据分片到多台服务器上,这样您就不必建立主服务器 或获得更大的主服务器(内存严重!!!!!)

编辑

您的操作系统的 LRU 应该已经换出了旧数据,因为 MongoDB 正在使用其完全分配的批次,这意味着如果没有交换 8GB,那是因为您的工作集占用了全部 8GB(很可能有一些最后交换)。

【讨论】:

当我重新启动 mongo db 时,RAM 从 8GB 变为 0.5 GB,当我想要第二页时,第一页没有加载(这是在使用 skip 时附加的)。我的问题是,我可以在不重新启动 mongo db 服务器的情况下释放这些内存吗? @user1132271 可能是:gtricks.com/uncategorized/… 但正如我所说,我建议改为解决问题 为什么一个加载一次的对象会在mongo服务器使用的内存中停留这么久?我关闭了来自客户端的连接,服务器仍然加载了该记录。有没有办法发行那张唱片? @user1132271 这是 wiki 中的一个很好的解释:en.wikipedia.org/wiki/Paging#Overview 关于下面的第二段,其中说明了 Windows LRU 何时取出您的旧数据。

以上是关于ram中使用的mongodb清除内存的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB、NUMA 硬件、页面错误但有足够的 RAM 用于工作集、触摸命令或 vmtouch/dd 未加载到内存中

MongoDB 索引限制

MongoDB索引限制

在 Linode 512 VPS 上运行 MongoDB 的可行性?

Mongodb:在 RAM 中保存经常写入的集合

MongoDB分片设计