我在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:)
答案 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中添加)