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

Posted

技术标签:

【中文标题】Mongoose(node.js 模块)导致 CPU 使用率高【英文标题】:Mongoose (node.js module) causes high CPU usage 【发布时间】:2013-02-12 09:23:40 【问题描述】:

我正在使用 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));
;

我还能如何加速这个热点?

注意,正如您所见,不是查询花费了很长时间,而是 Mongo 驱动程序花费了很长时间来处理结果(并且在过程)。

【问题讨论】:

【参考方案1】:

对于 Mongoose,使用 lean 选项来处理大型结果集的查询非常重要,在这些查询中除了纯 javascript 文档本身之外不需要任何内容​​。这应该提供与直接使用本机驱动程序相当的性能。

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

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

【讨论】:

我不知道我是如何在文档中错过的。谢谢! 在大型查找查询上使用 lean() 可将执行时间减少 70-80% 并消除 100% 的 CPU 峰值。非常有用的选项,我希望我早点知道! 如果可以的话,我会投票 20 次。我没有想法,这确实救了我

以上是关于Mongoose(node.js 模块)导致 CPU 使用率高的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

Node.js | MongoDB 入门讲解 & Mongoose 模块的初步应用

如何让 node.js 使用 mongoose 连接到 mongolab