猫鼬水化性能

时间:2015-01-20 16:46:33

标签: node.js performance express mongoose meanjs

我目前正在http://meanjs.org/堆栈上开发一个nodejs应用程序。

我使用newrelic自定义工具来分析我的应用(http://blog.newrelic.com/2014/09/16/nodejs-custom-instrumentation/

Bench告诉我有一些性能问题 从跟踪分析看来,问题来自于从mongodb接收回调后的猫鼬代码juste(我认为水合部分)。

为了证明这一点,我用mongojs替换一个mongoose find()(参见npm)一:呼叫的平均速度从~1100ms到~20ms!

来自newrelic的截图:

带猫鼬的Perf:
http://postimg.org/image/7bqv2gbnt/

追踪细节(猫鼬):
http://postimg.org/image/eqg6utxjd/
=>主题查找和问题查找之间的代码基本上是mongoose internal + two if:/(参见下面的代码)

Perf with mongojs:
http://postimg.org/image/3tev62art/

我想我一定做错了猫鼬得到这么糟糕的结果,但我无法弄清楚它是什么,任何帮助都会受到赞赏。

<的更新>
使用node-mongodb-native通过mongoose(Document.collection)进行相同的测试,结果类似于我用mongojs得到的结果,这让我觉得问题来自于实例和安全性。猫鼬物体的水合作用) 来自猫鼬的本地驱动程序的Perf: http://postimg.org/image/67mpo9ncd/
使用的代码: https://gist.github.com/Nihaux/20e69c5c40fe1faad2c1
<的 / UPDATE >

< 更新2 >
猫鼬使用的版本是:“3.8.17”
< / UPDATE 2 >

< 更新3 - 问题得到解决>

1)我没有限制我对猫鼬请求的要求所以我得到~20个问题对象而不是3 * facepalm *

2)Ryan建议的精益选项确实绕过了水合作用并节省了一些cpu。

3)我最终使用Jetbrains spyjs分析代码,我没有重现原生与猫鼬之间的相同差异。
使用猫鼬+精益选项,执行时间的差异大约增加30% 我想我之前找到了这样的结果,因为我正在为服务器提供服务:
使用猫鼬时,cpu负载过高,进程堆叠 对于本地驱动程序,我处于那个昙花一现的地方,因此没有出现“问题” < / UPDATE 3 >

以下是我对代码所做的更改:

ThemeDoc.isValidForGame(themeId, function(err, isValid) {
    if (isValid) {

其中isValidForGame是:

ThemeSchema.statics.isValidForGame = function(themeId, callback){
mongoose.model('Theme').find({
    '_id': themeId,
    'available': true
}).exec(function(err, theme) {
    if (err) {
        callback(err, false);
        return;
    }

    if (theme.length === 0) {
        callback(null, false);
        return;
    }

    mongoose.model('Question').find({'theme': themeId}).exec(function(err, questions) {
        if (err) {
            callback(err, false);
            return;
        }

        if (questions.length === 0) {
            callback(null, false);
            return;
        }

        callback(null,true);

    });

});

};

db.collection('themes').find({_id: mongojs.ObjectId(themeId)})
    .limit(1, function (err, themes) {

        if (themes.length == 1) {
            db.collection('questions').find({'theme': mongojs.ObjectId(themeId)}).
                limit(3, function(err, questions) {

                    if(questions.length == 3) {

问题的要点&主题图式:
https://gist.github.com/Nihaux/395c600879c5d68c5011

0 个答案:

没有答案