【问题标题】:How do I have Mongo 3.0 / WiredTiger load my whole database into RAM?如何让 Mongo 3.0 / WiredTiger 将我的整个数据库加载到 RAM 中?
【发布时间】:2015-07-22 20:49:01
【问题描述】:

我有一个大约 5 GB 的静态数据库(甚至永远不会收到写入),而我的服务器 RAM 是 30 GB。我专注于尽快将复杂的聚合返回给用户,所以我看不出我不应该存储 (a) 索引和 (b) 整个数据集的原因完全在 RAM 中,并且 (c) 在 Mongo 服务器启动时自动存储在那里。目前我的主要瓶颈是运行组命令以从数百万行中查找唯一元素。

我的问题是,在新的 Mongo/WiredTiger 上运行时,我该怎么做 (a)、(b) 或 (c)?我知道“touch”命令不适用于 WiredTiger,因此 Internet 上的大多数信息似乎都已过时。 (a)、(b) 或 (c) 是否已经自动完成?我不应该对这个用例执行这些步骤吗?

【问题讨论】:

  • 你能举一个你的模型和查询的例子吗?
  • 好吧,我有几百万个文档,看起来像 `{field1: "a", field2: "b"},在 field1 和 field2 上都有索引,在 field1 和 field2 上有一个复合索引;我运行一个聚合管道,在其中匹配 field1 和 field2,然后按 field1 执行 $group 以获取 field1 的所有唯一值,然后 $group 对它们进行计数,并返回计数。当我想让它成为 时,返回计数可能需要几秒钟
  • 使用 db.serverStatus() 来计算 mongo 对你的内存所做的总计。使用 mongostat 检查“dirty %”和“used %”,以确定 WiredTiger 正在使用多少缓存。另外我猜你在启动 Mongo 时不会以某种方式将 --wiredTigerCacheSizeGB 设置为某个小值?
  • 这是我的块管理器和来自 db.serverStatus() 的缓存结果:pastebin.com/6MgqQyBS,我的 WiredTigerCacheSizeGB 设置为 25。
  • 尝试运行 aggregate().explain() 看看你的索引是否正在使用

标签: mongodb wiredtiger database


【解决方案1】:

通常你不应该做任何事情。磁盘页面根据请求加载到 RAM 中并留在那里。如果没有更多可用内存,则旧的(未使用的)页面将被卸载以供其他需要它们的程序使用。

如果您必须将整个数据库放在 ram 中,您可以使用 ramdisk 并告诉 mongo 将其用作存储设备。

我建议您修改索引和/或数据结构。拥有正确的可以在性能上产生巨大的差异。我们谈论的是秒与小时。

【讨论】:

  • 我如何知道 Mongo 正在将什么加载到 RAM 中?即使在重新启动 mongo 之后,我的 RAM 使用量也是静态的大约 1 GB,并且似乎不会根据我运行的查询而改变。数据库为 5 GB,总索引大小约为 3 GB。
猜你喜欢
  • 2010-09-29
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多