2013-02-26 70 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