Mongoose(node.js模块)导致高CPU使用率

Zan*_*aes 4 mongoose mongodb node.js

我正在使用nodetime来分析我的node.js应用程序的高CPU使用率.超过30%的CPU使用来自Mongoose:

在此输入图像描述

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

相信之前我已经听说过Mongoose会导致CPU使用率过高,最好跳过它并直接使用Mongo驱动程序.这准确吗?

这是"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));
};
Run Code Online (Sandbox Code Playgroud)

我怎么可能加快这个热点?

请注意,查询需要花费很长时间,正如您所看到的,而是需要很长时间来处理结果的Mongo驱动程序(并且在此过程中消耗了大量CPU).

Joh*_*yHK 13

使用Mongoose,将lean选项用于具有大型结果集的查询非常重要,除了纯JavaScript文档本身之外,您不需要任何其他内容.这应该提供与直接使用本机驱动程序相当的性能.

例如,在上面的情况下,它将是:

this.model.find({$or: or}, fields).lean().exec(function(e, matches) {
    // ... excluded for brevity
}).bind(this));
Run Code Online (Sandbox Code Playgroud)

  • 在大型查找查询上使用lean()会将执行时间减少70-80%,并消除100%的CPU峰值.我希望我早点知道的非常有用的选项! (4认同)