Mongo的聚合命令未充分利用CPU

时间:2012-12-09 04:27:23

标签: mongodb performance aggregation-framework

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

在我的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个内核,甚至部分使用了它们。

Mongo的工程师能否解释一下这个实施的理由?我很好奇为什么不使用更多的资源。为什么不平衡所有核心的负载,因为你有一个我正在分组的字段的索引。

鉴于在使用6.5M文档的集合上执行了查询(mongobackup生成5GB文件)。所以这没什么大不了的。

PS。和奖金问题:你有没有想过使用GPU?我的笔记本电脑上有1024核GPU:)

1 个答案:

答案 0 :(得分: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中添加)