2013-02-26 73 views
3

我正在使用nodetime来分析node.js应用程序的高CPU使用率。 CPU使用率的 超过30%是从猫鼬来:Mongoose(node.js模块)导致高CPU使用率

enter image description here

下一个最大的罪魁祸首,在仅5%,是垃圾收集器。

相信我以前听说过,那猫鼬会导致CPU使用率很高,而且它可以是最好跳过它,直接使用蒙戈驱动程序。这是否准确?

这里的“Geocode.decodeMnay”功能,触发此特定热点...

Geocode.prototype.decodeMany = function(strs, callback) 
{ 
    var or = [], 
     map = {}, 
     fields = {'woeid': 1, 'matched_queries': 1, 'latitude': 1, 'longitude': 1, 'radius': 1, 'name': 1}, 
     unique = []; 

    strs = _.uniq(strs); 
    for(var k=0; k<strs.length; k++) 
     or.push({'matched_queries':strs[k].trim()});  

    this.model.find({$or: or}, fields, (function(e,matches){ 
     // ... excluded for brevity 
    }).bind(this)); 
}; 

我否则怎么可能会加快这一热点?

note它不是查询需要很长时间,正如您所看到的,而是需要很长时间来处理结果(并且在进程中消耗大量CPU)的Mongo驱动程序。

回答

9

在Mongoose中,对于具有大型结果集的查询使用lean选项非常重要,因为除非是普通的JavaScript文档本身,否则不需要其他任何内容。这应该提供与直接使用本地驱动程序相当的性能。

例如,在上述情况下这将是:

this.model.find({$or: or}, fields).lean().exec(function(e, matches) { 
    // ... excluded for brevity 
}).bind(this)); 
+0

我不知道如何我的文档中错过了这个。谢谢! – 2013-02-26 19:52:31

+2

在大型查找查询中使用lean()将执行时间减少了70-80%,并消除了100%的CPU峰值。非常有用的选项,我希望我早点知道! – 2013-07-29 17:35:08