1

我在 i7 八核 CPU 上的 Windows 7 x64 上运行 Mongo 2.2.2。我们的生产服务器在 Red Hat Enterprise 下运行在具有相同版本 Mongo 的 256 核机器上。

在我对 Windows 机器上的以下调用的测试中

db.users_v2_prod.aggregate( { $group : {_id : "$email", total : { $sum : 1 } } }, { $match : { total : { $gte : 3 } } }, { $sort : {total : -1} }, {$limit : 5} )

我注意到 mongo 未充分利用可用资源。在查询期间,CPU 上的总负载约为 10%。根据 Process Explorer 计算只发生在一个线程中。mongod似乎只使用了我拥有的 8 个内核中的 3 个,甚至它们也被部分使用。

Mongo 的工程师能否解释一下他们对此实现的理由?我很好奇为什么不使用更多可用的资源。为什么不并行处理所有内核的负载,因为您有我要分组的字段的索引。

给定查询是在包含 650 万个文档的集合上执行的(mongobackup 生成 5GB 文件)。所以这没什么疯狂的。

PS。还有一个额外的问题:你考虑过使用 GPU 吗?我的笔记本电脑上有 1024 核 GPU :)

4

1 回答 1

2

CPU 很可能不是这里的限制因素——在 MongoDB 的典型用例中,大多数情况下都是如此。您的查询看起来不是计算密集型的,因此它更有可能在从磁盘分页数据或耗尽 RAM 方面达到限制。

如果没有看到运行的实际统计数据就很难说(为此我建议在MMS中安装主机并安装munin-node),但我很少看到 CPU 是 MongoDB 实例的瓶颈。

说了这么多,并行化可能可以改进,但它可能不是最快的实现。如果以上都没有发生或相关,那么我会看看你是否可以并行运行多个作业,或者可能在客户端更多地拆分工作,看看你是否可以通过这种方式改进问题。您还应该观看/投票/评论这些问题:

https://jira.mongodb.org/browse/SERVER-5091(并行聚合操作) https://jira.mongodb.org/browse/SERVER-5088(并行查询) https://jira.mongodb.org/browse /SERVER-4504(为聚合框架添加解释)(在 2.6 中添加)

于 2012-12-10T16:29:28.730 回答